<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">


  <link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">

<link rel="stylesheet" href="/next/css/main.css">



<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.3/css/all.min.css" integrity="sha256-2H3fkXt6FEmrReK448mDVGKb3WW2ZZw35gI7vqHOE4Y=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" integrity="sha256-Vzbj7sDDS/woiFS3uNKo8eIuni59rjyNGtXfstRzStA=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"cnhuazhu.gitee.io","root":"/next/","images":"/next/images","scheme":"Mist","version":"8.6.1","exturl":false,"sidebar":{"position":"left","Muse | Mist":320,"display":"post","padding":18,"offset":12},"copycode":true,"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":true,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"},"path":"/next/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/next/js/config.js"></script>
<meta name="description" content="记录计算机网络学习历程">
<meta property="og:type" content="article">
<meta property="og:title" content="计算机网络学习笔记-网络层">
<meta property="og:url" content="https://cnhuazhu.gitee.io/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/index.html">
<meta property="og:site_name" content="花猪のBlog">
<meta property="og:description" content="记录计算机网络学习历程">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络层服务模型.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E8%BD%AC%E5%8F%91%E8%A1%A8.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E7%BB%93%E6%9E%84%E6%A6%82%E5%86%B52.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E4%B8%89%E7%A7%8D%E5%85%B8%E5%9E%8B%E7%9A%84%E4%BA%A4%E6%8D%A2%E6%9C%BA%E6%9E%84.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP协议栈位置.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E6%95%B0%E6%8D%AE%E6%8A%A5%E6%A0%BC%E5%BC%8F.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%8F%B7%E4%B8%BE%E4%BE%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%9C%B0%E5%9D%80%E7%B1%BB%E5%9E%8B%E5%88%92%E5%88%86.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网掩码示例.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BD%AC%E5%8F%91%E8%A1%A8%E5%88%86%E6%9E%90.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDHCP过程.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv6%E6%A0%BC%E5%BC%8F.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E5%88%B0IPv6%E7%9A%84%E8%BF%87%E6%B8%A1.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E9%9A%A7%E9%81%93.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4隧道视图2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络的图抽象.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNLS%E7%AE%97%E6%B3%95%E6%B5%81%E7%A8%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BF%AA%E6%9D%B0%E6%96%AF%E7%89%B9%E6%8B%89%E7%AE%97%E6%B3%95%E6%A1%88%E4%BE%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E9%93%BE%E8%B7%AF%E5%8F%AF%E8%83%BD%E9%9C%87%E8%8D%A1.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由选择示例.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由案例一续改.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量算法每个节点.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%A5%BD%E6%B6%88%E6%81%AF.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%9D%8F%E6%B6%88%E6%81%AF.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A3%82%E7%AE%97%E6%B3%95%E4%B8%BE%E4%BE%8B.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN水平分裂算法问题.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例续.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%BE%9D%E8%B5%96.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN层次化OSPF路由.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP连接.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%BF%9E%E6%8E%A52.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E7%83%AD%E5%9C%9F%E8%B1%86%E8%B7%AF%E7%94%B1.png">
<meta property="article:published_time" content="2021-06-08T07:10:24.000Z">
<meta property="article:modified_time" content="2021-06-14T15:09:38.454Z">
<meta property="article:author" content="花猪">
<meta property="article:tag" content="计算机网络">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络层服务模型.png">


<link rel="canonical" href="https://cnhuazhu.gitee.io/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"https://cnhuazhu.gitee.io/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/","path":"2021/06/08/计算机网络/计算机网络学习笔记-网络层/","title":"计算机网络学习笔记-网络层"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>计算机网络学习笔记-网络层 | 花猪のBlog</title>
  




  <noscript>
    <link rel="stylesheet" href="/next/css/noscript.css">
  </noscript>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/next/" class="brand" rel="start">
      <i class="logo-line"></i>
      <h1 class="site-title">花猪のBlog</h1>
      <i class="logo-line"></i>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu">
        <li class="menu-item menu-item-主站"><a href="https://cnhuazhu.top/" rel="noopener" target="_blank"><i class="fas fa-chevron-right fa-fw"></i>主站</a></li>
        <li class="menu-item menu-item-home"><a href="/next/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li>
        <li class="menu-item menu-item-tags"><a href="/next/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">14</span></a></li>
        <li class="menu-item menu-item-categories"><a href="/next/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类<span class="badge">8</span></a></li>
        <li class="menu-item menu-item-archives"><a href="/next/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">53</span></a></li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup"><div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off" maxlength="80"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close" role="button">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div class="search-result-container no-result">
  <div class="search-result-icon">
    <i class="fa fa-spinner fa-pulse fa-5x"></i>
  </div>
</div>

    </div>
  </div>

</div>
        
  
  <div class="toggle sidebar-toggle" role="button">
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
  </div>

  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%89%8D%E8%A8%80"><span class="nav-number">1.</span> <span class="nav-text">前言</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%AC%AC%E5%9B%9B%E7%AB%A0%EF%BC%9A%E7%BD%91%E7%BB%9C%E5%B1%82"><span class="nav-number">2.</span> <span class="nav-text">第四章：网络层</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%AF%BC%E8%AE%BA"><span class="nav-number">2.1.</span> <span class="nav-text">导论</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E6%95%B0%E6%8D%AE%E5%B9%B3%E9%9D%A2%E4%B8%8E%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2"><span class="nav-number">2.1.1.</span> <span class="nav-text">数据平面与控制平面</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%BD%91%E7%BB%9C%E6%9C%8D%E5%8A%A1%E6%A8%A1%E5%9E%8B"><span class="nav-number">2.1.2.</span> <span class="nav-text">网络服务模型</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%99%9A%E7%94%B5%E8%B7%AF%E5%92%8C%E6%95%B0%E6%8D%AE%E6%8A%A5%E7%BD%91%E7%BB%9C"><span class="nav-number">2.2.</span> <span class="nav-text">虚电路和数据报网络</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%99%9A%E7%94%B5%E8%B7%AF%E7%BD%91%E7%BB%9C"><span class="nav-number">2.2.1.</span> <span class="nav-text">虚电路网络</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E7%BB%84%E6%88%90"><span class="nav-number">2.3.</span> <span class="nav-text">路由器的组成</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3"><span class="nav-number">2.3.1.</span> <span class="nav-text">输入端口</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%BA%A4%E6%8D%A2%E7%BB%93%E6%9E%84"><span class="nav-number">2.3.2.</span> <span class="nav-text">交换结构</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3"><span class="nav-number">2.3.3.</span> <span class="nav-text">输出端口</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%B0%83%E5%BA%A6%E6%9C%BA%E5%88%B6"><span class="nav-number">2.3.4.</span> <span class="nav-text">调度机制</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#IP%E5%8D%8F%E8%AE%AE%EF%BC%88Internet-Protocol%EF%BC%89"><span class="nav-number">2.4.</span> <span class="nav-text">IP协议（Internet Protocol）</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#IP%E6%95%B0%E6%8D%AE%E6%8A%A5%E6%A0%BC%E5%BC%8F"><span class="nav-number">2.4.1.</span> <span class="nav-text">IP数据报格式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#IP-%E5%88%86%E7%89%87%E5%92%8C%E9%87%8D%E7%BB%84"><span class="nav-number">2.4.2.</span> <span class="nav-text">IP 分片和重组</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#IPv4"><span class="nav-number">2.4.3.</span> <span class="nav-text">IPv4</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#IP%E7%BC%96%E5%9D%80"><span class="nav-number">2.4.3.1.</span> <span class="nav-text">IP编址</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AD%90%E7%BD%91%EF%BC%88Subnets-%EF%BC%89"><span class="nav-number">2.4.3.2.</span> <span class="nav-text">子网（Subnets)）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#IP%E5%9C%B0%E5%9D%80%E5%88%86%E7%B1%BB"><span class="nav-number">2.4.3.3.</span> <span class="nav-text">IP地址分类</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E6%97%A0%E7%B1%BB%E5%9F%9F%E9%97%B4%E8%B7%AF%E7%94%B1%EF%BC%88CIDR%EF%BC%89"><span class="nav-number">2.4.3.4.</span> <span class="nav-text">无类域间路由（CIDR）</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#NAT%EF%BC%88Network-Address-Translation%EF%BC%89"><span class="nav-number">2.4.4.</span> <span class="nav-text">NAT（Network Address Translation）</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#ICMP"><span class="nav-number">2.4.5.</span> <span class="nav-text">ICMP</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#Traceroute"><span class="nav-number">2.4.5.1.</span> <span class="nav-text">Traceroute</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#IPv6"><span class="nav-number">2.4.6.</span> <span class="nav-text">IPv6</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9%E7%AE%97%E6%B3%95"><span class="nav-number">2.5.</span> <span class="nav-text">路由选择算法</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%B7%AF%E7%94%B1%EF%BC%88route%EF%BC%89"><span class="nav-number">2.5.1.</span> <span class="nav-text">路由（route）</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%93%BE%E8%B7%AF%E7%8A%B6%E6%80%81%E7%AE%97%E6%B3%95%EF%BC%88link-state%EF%BC%8CLS%EF%BC%89"><span class="nav-number">2.5.2.</span> <span class="nav-text">链路状态算法（link state，LS）</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%9F%BA%E6%9C%AC%E5%B7%A5%E4%BD%9C%E8%BF%87%E7%A8%8B"><span class="nav-number">2.5.2.1.</span> <span class="nav-text">基本工作过程</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%BA%94%E7%94%A8%E6%83%85%E5%86%B5"><span class="nav-number">2.5.2.2.</span> <span class="nav-text">应用情况</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E7%AE%97%E6%B3%95%E5%8E%9F%E7%90%86"><span class="nav-number">2.5.2.3.</span> <span class="nav-text">算法原理</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Dijkstra%E7%AE%97%E6%B3%95%E7%9A%84%E8%AE%A8%E8%AE%BA"><span class="nav-number">2.5.2.4.</span> <span class="nav-text">Dijkstra算法的讨论</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%B7%9D%E7%A6%BB%E7%9F%A2%E9%87%8F%E7%AE%97%E6%B3%95%EF%BC%88distance-vector%EF%BC%8CDV%EF%BC%89"><span class="nav-number">2.5.3.</span> <span class="nav-text">距离矢量算法（distance vector，DV）</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%AE%9E%E4%BE%8B"><span class="nav-number">2.5.3.1.</span> <span class="nav-text">实例</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E8%B4%9D%E5%B0%94%E6%9B%BC-%E7%A6%8F%E7%89%B9%EF%BC%88Bellman-Ford-%EF%BC%89%E6%96%B9%E7%A8%8B"><span class="nav-number">2.5.3.2.</span> <span class="nav-text">贝尔曼-福特（Bellman-Ford ）方程</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#DV%E7%9A%84%E7%89%B9%E7%82%B9"><span class="nav-number">2.5.3.3.</span> <span class="nav-text">DV的特点</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A3%82-split-horizon-%E7%AE%97%E6%B3%95"><span class="nav-number">2.5.3.4.</span> <span class="nav-text">水平分裂(split horizon)算法</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#LS-%E5%92%8C-DV-%E7%AE%97%E6%B3%95%E7%9A%84%E6%AF%94%E8%BE%83"><span class="nav-number">2.5.4.</span> <span class="nav-text">LS 和 DV 算法的比较</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%9B%A0%E7%89%B9%E7%BD%91%E4%B8%AD%E8%87%AA%E6%B2%BB%E7%B3%BB%E7%BB%9F%EF%BC%88AS%EF%BC%89%E5%86%85%E9%83%A8%E7%9A%84%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9"><span class="nav-number">2.6.</span> <span class="nav-text">因特网中自治系统（AS）内部的路由选择</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9%E4%BF%A1%E6%81%AF%E5%8D%8F%E8%AE%AE%EF%BC%88Routing-Information-Protocol%EF%BC%8CRIP%EF%BC%89"><span class="nav-number">2.6.1.</span> <span class="nav-text">路由选择信息协议（Routing Information Protocol，RIP）</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E9%93%BE%E8%B7%AF%E5%A4%B1%E6%95%88%E5%92%8C%E6%81%A2%E5%A4%8D"><span class="nav-number">2.6.1.1.</span> <span class="nav-text">链路失效和恢复</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#RIP-%E8%BF%9B%E7%A8%8B%E5%A4%84%E7%90%86"><span class="nav-number">2.6.1.2.</span> <span class="nav-text">RIP 进程处理</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BC%80%E6%94%BE%E6%9C%80%E7%9F%AD%E8%B7%AF%E4%BC%98%E5%85%88%EF%BC%88Open-Shortest-Path-First%EF%BC%8COSFP%EF%BC%89"><span class="nav-number">2.6.2.</span> <span class="nav-text">开放最短路优先（Open Shortest Path First，OSFP）</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#OSPF%E9%AB%98%E7%BA%A7%E7%89%B9%E6%80%A7"><span class="nav-number">2.6.2.1.</span> <span class="nav-text">OSPF高级特性</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#ISP%E4%B9%8B%E9%97%B4%E7%9A%84%E8%B7%AF%E7%94%B1%E9%80%89%E6%8B%A9"><span class="nav-number">2.7.</span> <span class="nav-text">ISP之间的路由选择</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%80%E4%B8%AA%E5%B9%B3%E9%9D%A2%E7%9A%84%E8%B7%AF%E7%94%B1"><span class="nav-number">2.7.1.</span> <span class="nav-text">一个平面的路由</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%B1%82%E6%AC%A1%E8%B7%AF%E7%94%B1"><span class="nav-number">2.7.2.</span> <span class="nav-text">层次路由</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%BE%B9%E7%95%8C%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%EF%BC%88Border-Gateway-Protocol%EF%BC%8CBGP%EF%BC%89"><span class="nav-number">2.7.3.</span> <span class="nav-text">边界网关协议（Border Gateway Protocol，BGP）</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#BGP%E4%BC%9A%E8%AF%9D"><span class="nav-number">2.7.3.1.</span> <span class="nav-text">BGP会话</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#BGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A"><span class="nav-number">2.7.3.2.</span> <span class="nav-text">BGP路径通告</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#BGP%E6%8A%A5%E6%96%87"><span class="nav-number">2.7.3.3.</span> <span class="nav-text">BGP报文</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#BGP-%E8%B7%AF%E5%BE%84%E9%80%89%E6%8B%A9"><span class="nav-number">2.7.3.4.</span> <span class="nav-text">BGP 路径选择</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E7%83%AD%E5%9C%9F%E8%B1%86%E8%B7%AF%E7%94%B1"><span class="nav-number">2.7.3.5.</span> <span class="nav-text">热土豆路由</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%86%85%E9%83%A8%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%E4%B8%8E%E5%A4%96%E9%83%A8%E7%BD%91%E5%85%B3%E5%8D%8F%E8%AE%AE%E7%9A%84%E4%B8%8D%E5%90%8C"><span class="nav-number">2.7.4.</span> <span class="nav-text">内部网关协议与外部网关协议的不同</span></a></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%90%8E%E8%AE%B0"><span class="nav-number">3.</span> <span class="nav-text">后记</span></a></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-overview">
            <div class="site-author site-overview-item animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="花猪"
      src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">
  <p class="site-author-name" itemprop="name">花猪</p>
  <div class="site-description" itemprop="description">为了获得不同的阅读体验，建立此分站。<br>（可在导航栏搜索想要查看的文章）<br><br>本站主题：NEXT 8.6.1</div>
</div>
<div class="site-state-wrap site-overview-item animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/next/archives/">
        
          <span class="site-state-item-count">53</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/next/categories/">
          
        <span class="site-state-item-count">8</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/next/tags/">
          
        <span class="site-state-item-count">14</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author site-overview-item animated">
      <span class="links-of-author-item">
        <a href="https://github.com/CNhuazhu" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;CNhuazhu" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
  </div>



          </div>
        </div>
      </div>
    </div>
  </aside>
  <div class="sidebar-dimmer"></div>


    </header>

    
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

  <a href="https://github.com/CNhuazhu" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://cnhuazhu.gitee.io/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">
      <meta itemprop="name" content="花猪">
      <meta itemprop="description" content="为了获得不同的阅读体验，建立此分站。<br>（可在导航栏搜索想要查看的文章）<br><br>本站主题：NEXT 8.6.1">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="花猪のBlog">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          计算机网络学习笔记-网络层
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2021-06-08 15:10:24" itemprop="dateCreated datePublished" datetime="2021-06-08T15:10:24+08:00">2021-06-08</time>
    </span>
      <span class="post-meta-item">
        <span class="post-meta-item-icon">
          <i class="far fa-calendar-check"></i>
        </span>
        <span class="post-meta-item-text">更新于</span>
        <time title="修改时间：2021-06-14 23:09:38" itemprop="dateModified" datetime="2021-06-14T23:09:38+08:00">2021-06-14</time>
      </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/next/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" itemprop="url" rel="index"><span itemprop="name">学习笔记</span></a>
        </span>
    </span>

  
    <span id="/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/" class="post-meta-item leancloud_visitors" data-flag-title="计算机网络学习笔记-网络层" title="阅读次数">
      <span class="post-meta-item-icon">
        <i class="far fa-eye"></i>
      </span>
      <span class="post-meta-item-text">阅读次数：</span>
      <span class="leancloud-visitors-count"></span>
    </span>
    <span id="/next/2021/06/08/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E7%BD%91%E7%BB%9C%E5%B1%82/" class="post-meta-item twikoo_visitors" data-flag-title="计算机网络学习笔记-网络层" title="阅读次数">
      <span class="post-meta-item-icon">
        <i class="far fa-eye"></i>
      </span>
      <span class="post-meta-item-text">阅读次数：</span>
      <span id="twikoo_visitors"></span>
    </span>
  
      </div>
      <div class="post-meta">
    <span class="post-meta-item" title="本文字数">
      <span class="post-meta-item-icon">
        <i class="far fa-file-word"></i>
      </span>
      <span class="post-meta-item-text">本文字数：</span>
      <span>20k</span>
    </span>
    <span class="post-meta-item" title="阅读时长">
      <span class="post-meta-item-icon">
        <i class="far fa-clock"></i>
      </span>
      <span class="post-meta-item-text">阅读时长 &asymp;</span>
      <span>18 分钟</span>
    </span>
</div>

            <div class="post-description">记录计算机网络学习历程</div>
        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
        <h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><em>正在学习计算机网络这门课程，顺便做个笔记，记录一下知识点。</em></p>
<blockquote>
<p>参考资料：</p>
<p>中科大郑烇老师全套《计算机网络（自顶向下方法 第7版，James F.Kurose，Keith W.Ross）》课程：<a target="_blank" rel="noopener" href="https://www.bilibili.com/video/BV1JV411t7ow?p=1">https://www.bilibili.com/video/BV1JV411t7ow?p=1</a></p>
<p>《计算机网络（自顶向下方法 第7版，James F.Kurose，Keith W.Ross）》</p>
</blockquote>
<hr>
<h1 id="第四章：网络层"><a href="#第四章：网络层" class="headerlink" title="第四章：网络层"></a>第四章：网络层</h1><h2 id="导论"><a href="#导论" class="headerlink" title="导论"></a>导论</h2><p>网络层所提供的服务：</p>
<ul>
<li>在发送主机和接收主机对之间传送段（segment）<ul>
<li>在发送端将段封装到数据报中</li>
<li>在接收端，将段上交给传输层实体</li>
</ul>
</li>
<li>网络层协议存在于每一个主机和路由器<ul>
<li>路由器检查每一个经过它的IP数据报的头部</li>
</ul>
</li>
</ul>
<p>网络层的关键功能：<strong>转发</strong>和<strong>路由</strong></p>
<ul>
<li><p>转发：将分组从路由器的输入接口转发到合适的输出接口</p>
<p>这是一个局部的功能</p>
<p>是数据平面的功能</p>
<blockquote>
<p>路由器从不同的端口接收分组，再通过合适的端口将其分发出去。</p>
</blockquote>
</li>
<li><p>路由：使用路由算法来决定分组从发送主机到目标接收主机的路径</p>
<p>这是一个全局的功能</p>
<p>是控制平面的功能</p>
<ul>
<li>路由选择算法</li>
<li>路由选择协议</li>
</ul>
</li>
</ul>
<blockquote>
<p>举个例子说明转发与路由：</p>
<p>计算机网络一口气学了好长时间，打算去郊区的公园散散心：</p>
<ul>
<li>转发就好像是在行程中通过每个路口时的决策，从哪里进入路口，又从哪里出去</li>
<li>路由就像是在出发前用手机导航规划全局路径的过程</li>
</ul>
</blockquote>
<h3 id="数据平面与控制平面"><a href="#数据平面与控制平面" class="headerlink" title="数据平面与控制平面"></a>数据平面与控制平面</h3><ul>
<li><p>数据平面：</p>
<p>局部的处理，每个路由的功能：</p>
<ul>
<li>决定从路由器输入端口到达的分组如何转发到输出端口</li>
<li>转发功能：<ul>
<li>传统方式：基于目标地址 + 转发表</li>
<li>SDN方式：基于多个字段 + 流表</li>
</ul>
</li>
</ul>
</li>
<li><p>控制平面：</p>
<p>全局的处理，网络范围内的逻辑：</p>
<ul>
<li>决定数据报如何在路由器之间路由，决定数据报从源到目标主机之间的端到端路径</li>
<li>两个个控制平面方法：<ul>
<li>传统的路由算法: 在路由器中被实现（路由表）</li>
<li>SDN（software-defined networking，软件定义网络）：在远程的服务器中实现</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>传统方式：每一个路由器既实现了数据平面的功能，也实现了控制平面的功能。</p>
<ul>
<li><p>在每一个路由器中的单独路由器算法元件，在控制平面进行交互</p>
<ul>
<li>控制平面：路由算法决定端到端路径（分布式操作）</li>
<li>数据平面：IP协议根据转发表决定了IP数据报在此路由器上的局部转发（分布式操作）</li>
<li>二者是紧耦合的，在一个路由实体中</li>
</ul>
<blockquote>
<p>在路由器之上有路由实体，这些路由实体之间要交换路由信息。然后分布式的计算路由表，交给IP协议实体，然后IP协议实体根据路由表进行匹配，最后转发。</p>
</blockquote>
<ul>
<li>带来的问题：分布式的操作使得修改路由器的运行逻辑是一件困难的事情</li>
</ul>
</li>
</ul>
<p>SDN方式：逻辑集中的控制平面</p>
<ul>
<li>一个不同的（通常是远程的）控制器与本地控制代理（CAs）交互<ul>
<li>控制平面的功能集中在一个服务器（远程控制器，Remote Controller）上去实现，计算得到流表，将其交给每一个分组交换设备，分组交换设备对流表进行装载，对接收到的IP实体做多字段的匹配（传统方式只匹配目标主机的IP地址），按照流表对应的动作对IP实体进行操作，包括：转发，阻塞（block），泛洪等</li>
<li>分组交换设备仅按照远端的服务器计算发来的流表进行操作，这样改变其行为逻辑就会简单许多。</li>
<li>由此分析：控制平面是集中式的、远程的，便于修改。</li>
</ul>
</li>
</ul>
<h3 id="网络服务模型"><a href="#网络服务模型" class="headerlink" title="网络服务模型"></a>网络服务模型</h3><p>从发送方主机到接收方主机传输数据报的“通道”，网络提供的服务模型：</p>
<ul>
<li>对于单个数据报的服务：<ul>
<li>可靠传送</li>
<li>延迟保证，如：少于40ms的延迟</li>
</ul>
</li>
<li>对于数据报流的服务：<ul>
<li>保序数据报传送</li>
<li>保证流的最小带宽</li>
<li>分组之间的延迟差</li>
</ul>
</li>
<li>连接建立：在某些网络架构中是第三个重要的功能<ul>
<li>在分组传输之前，在两个主机之间，在通过一些路由器所构成的路径上建立一个网络层连接（涉及到路由器）</li>
<li>网络层和传输层连接服务区别：<ul>
<li>网络层: 在两个主机之间，涉及到路径上的一些路由器</li>
<li>传输层: 在两个进程之间，很可能只体现在端系统上(TCP连接)</li>
</ul>
</li>
</ul>
</li>
</ul>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络层服务模型.png" style="zoom:80%;" />

<h2 id="虚电路和数据报网络"><a href="#虚电路和数据报网络" class="headerlink" title="虚电路和数据报网络"></a>虚电路和数据报网络</h2><p>网络层能够在两台主机之间提供无连接的服务或有连接的服务</p>
<ul>
<li>数据报网络（datagram network）仅在网络层提供无连接服务</li>
<li>虚电路网络（Virtual-Circuit，VC）仅在网络层提供连接服务</li>
</ul>
<p>由上一章我们知道运输层也可以实现面向连接的服务，但是这与网络层实现连接服务是不同的：</p>
<ul>
<li><p>网络层提供的是主机到主机（host-to-host）间的服务</p>
<blockquote>
<p>运输层提供进程到进程间的服务</p>
</blockquote>
</li>
<li><p>网络层连接服务除了在端系统中，也在位于网络核心的路由器中出现</p>
<blockquote>
<p>运输层的连接服务只在端系统中实现</p>
</blockquote>
</li>
</ul>
<h3 id="虚电路网络"><a href="#虚电路网络" class="headerlink" title="虚电路网络"></a>虚电路网络</h3><p>虚电路网络从源头到目的地的路径表现得很像电话线路。</p>
<p>一条虚电路的组成如下：</p>
<ul>
<li><p>源和目的主机之间的路径（即一系列链路和路由器）</p>
</li>
<li><p>VC号，沿着该路径的每段链路的一个号码</p>
</li>
<li><p>沿着该路径的每台路由器中的转发表表项</p>
<blockquote>
<p>属于一条虚电路的分组将在它的首部携带一个VC号。因为一条虚电路在每条链路上可能具有不同的VC号，每台中间路由器必须用一个新的VC号替代每个传输分组的VC号，该新的VC号从转发表获得。</p>
</blockquote>
</li>
</ul>
<p>下图展示了一个简单的虚电路网络和对应路由器的转发表</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E8%BD%AC%E5%8F%91%E8%A1%A8.png"></p>
<blockquote>
<p>虚电路中路由器维持着连接状态信息</p>
</blockquote>
<p><em>（埋个坑，以后补充）</em></p>
<h2 id="路由器的组成"><a href="#路由器的组成" class="headerlink" title="路由器的组成"></a>路由器的组成</h2><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E5%99%A8%E7%BB%93%E6%9E%84%E6%A6%82%E5%86%B52.png"></p>
<p>路由：运行路由选择算法／协议 (RIP, OSPF, BGP)-生成路由表</p>
<p>路由器的组成包括：</p>
<ul>
<li>输入端口</li>
<li>输出端口</li>
<li>交换机（high-seed switching fabric）将输入端口与输出端口连接起来，构成局部的转发（根据路由表）。</li>
</ul>
<h3 id="输入端口"><a href="#输入端口" class="headerlink" title="输入端口"></a>输入端口</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png"></p>
<ul>
<li><p>物理层：把物理信号转化为数字信号（Bit级接收）</p>
</li>
<li><p>数据链路层：链路层协议动作、解封装得到IP协议实体</p>
<blockquote>
<p>判断帧头、帧尾，利用CRC检查出错（具体见下一章）</p>
</blockquote>
</li>
<li><p>网络层：通过路由表将分组进行转发</p>
<p>分布式交换：</p>
<ul>
<li>根据数据报头部的信息如：目的地址，在输入端口内存中的转发表中查找合适的输出端口（匹配+行动）</li>
<li>基于目标的转发：仅仅依赖于IP数据报的目标IP地址（传统方法）</li>
<li>通用转发：基于头部字段的任意集合进行转发</li>
</ul>
</li>
<li><p>输入端口缓存：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%85%A5%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png"></p>
<p>在输入端口会有一个队列，用于缓解输出、输入的不一致性。</p>
<ul>
<li><p>当交换机构的速率小于输入端口的汇聚速率时， 在输入端口可能要排队</p>
<blockquote>
<p>排队延迟以及由于输入缓存溢出可能造成丢失</p>
</blockquote>
</li>
<li><p>排在队头的数据报阻止了队列中其他数据报向前移动</p>
</li>
</ul>
</li>
</ul>
<h3 id="交换结构"><a href="#交换结构" class="headerlink" title="交换结构"></a>交换结构</h3><p>交换速率：分组可以按照该速率从输入传输到输出</p>
<ul>
<li>运行速度经常是输入/输出链路速率的若干倍</li>
<li>如果是N 个输入端口：交换机构的交换速度是输入线路速度的N倍比较理想，才不会成为瓶颈</li>
</ul>
<p>下面我们来分析分组如何从输入端口转向输出端口：</p>
<p>三种典型的交换机构</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E4%B8%89%E7%A7%8D%E5%85%B8%E5%9E%8B%E7%9A%84%E4%BA%A4%E6%8D%A2%E6%9C%BA%E6%9E%84.png"></p>
<ul>
<li><p>基于memory（内存）</p>
<ul>
<li><p>第一代路由器</p>
</li>
<li><p>路由器就是一个计算机，通过软件的方式实现路由</p>
</li>
<li><p>输入端口和输出端口分别插入网卡，从输入端口接收来的分组，通过系统总线，交给路由软件，匹配路由表，最后决定从哪一个网口发出。</p>
</li>
<li><p>转发速率被内存的带宽限制 (数据报通过BUS两遍)</p>
</li>
<li><p>一次只能转发一个分组</p>
</li>
</ul>
</li>
<li><p>基于bus（总线）</p>
<ul>
<li>数据报通过共享总线，从输入端口转发到输出端口</li>
<li>总线竞争: 交换速度受限于总线带宽</li>
<li>一次处理一个分组</li>
<li>总线速度能达到：Cisco 1900：1 Gbps；Cisco 5600：32 Gbps。对于接 入或企业级路由器，速度足够（ 但不适合区域或骨干网络）</li>
</ul>
</li>
<li><p>基于crossbar（互联网络）</p>
<ul>
<li>同时并发转发多个分组，克服总线带宽限制</li>
<li>当分组从端口A到达，转给端口Y；控制器短接相应的两个总线</li>
<li>高级设计：将数据报分片为固定长度的信元，通过交换网络交换（分组长度是不同的）</li>
<li>Cisco12000：以60Gbps的交换速率通过互联网络</li>
</ul>
</li>
</ul>
<h3 id="输出端口"><a href="#输出端口" class="headerlink" title="输出端口"></a>输出端口</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E5%8A%9F%E8%83%BD.png"></p>
<ul>
<li><p>网络层：接收fabric传来的分组，将分组排队，将分组交给对应链路层的网卡</p>
<blockquote>
<ul>
<li>当数据报从交换机构的到达速度比传输速率快 就需要输出端口缓存</li>
<li>同样，如果队列溢出，分组丢失</li>
<li>由调度规则选择排队的数据报进行传输（并不一定是先来先服务）</li>
</ul>
</blockquote>
</li>
<li><p>链路层：封装成帧（添加帧头、帧尾、目标MAC地址）</p>
</li>
<li><p>物理层：将数字信号转化为物理信号，将数据传出去</p>
</li>
<li><p>输出端口排队：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B7%AF%E7%94%B1%E8%BE%93%E5%87%BA%E7%AB%AF%E5%8F%A3%E7%BC%93%E5%AD%98.png"></p>
<ul>
<li>假设交换速率R<sub>switch</sub>是R<sub>line</sub>的N倍（N：输入端口的数量）</li>
<li>当多个输入端口同时向输出端口发送时，缓冲该分组（当通过交换网络到达的速率超过输出速率则缓存）</li>
<li>排队带来延迟，由于输出端口缓存溢出则丢弃数据报（不一定丢弃最后进入队列的分组，取决于规则）</li>
</ul>
</li>
</ul>
<h3 id="调度机制"><a href="#调度机制" class="headerlink" title="调度机制"></a>调度机制</h3><p>调度: 选择下一个要通过链路传输的分组</p>
<ul>
<li>FIFO (first in first out) scheduling: 按照分组到来的次序发送<ul>
<li>丢弃策略：<ul>
<li>tail drop: 丢弃刚到达的分组</li>
<li>priority: 根据优先权丢失/移除分组</li>
<li>random: 随机地丢弃/移除</li>
</ul>
</li>
</ul>
</li>
<li>优先权调度：发送最高优先权的分组<ul>
<li>多类，不同类别有不同的优先权<ul>
<li>类别可能依赖于标记或者其他的头部字段（如：IP source/dest, port numbers, ds，等）</li>
<li>先传高优先级的队列中的分组，除非没有</li>
<li>高（低）优先权中的分组传输次序：FIFO</li>
</ul>
</li>
</ul>
</li>
<li>轮转 （Round Robin (RR) ）调度：<ul>
<li>多类</li>
<li>循环扫描不同类型的队列, 发送完一类的一个分组，再发送下一个类的一个分组，循环所有类</li>
</ul>
</li>
<li>Weighted Fair Queuing (WFQ，加权公平队列)：<ul>
<li>一般化的Round Robin</li>
<li>在一段时间内，每个队列得到的服务时间是：W<sub>i</sub>  / (XIGMA(W<sub>i</sub> )) ×t，和权重成正比</li>
<li>每个类在每一个循环中获得不同权重的服务量</li>
</ul>
</li>
</ul>
<h2 id="IP协议（Internet-Protocol）"><a href="#IP协议（Internet-Protocol）" class="headerlink" title="IP协议（Internet Protocol）"></a>IP协议（Internet Protocol）</h2><p>IP协议在整个协议栈的位置：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP协议栈位置.png" style="zoom:80%;" />

<h3 id="IP数据报格式"><a href="#IP数据报格式" class="headerlink" title="IP数据报格式"></a>IP数据报格式</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E6%95%B0%E6%8D%AE%E6%8A%A5%E6%A0%BC%E5%BC%8F.png"></p>
<ul>
<li>固定20字节头部（一行4字节，固定一共5行）</li>
<li>除固定20字节头部外有可选项部分</li>
<li>body部分（数据载荷部分）<ul>
<li>TCP的段</li>
<li>UDP的数据报</li>
</ul>
</li>
</ul>
<blockquote>
<p>说明：</p>
<ul>
<li><p>ver（IP 协议版本号，4bit）：4 → IPv4； 6 → IPv6</p>
</li>
<li><p>head.len（头部长度，4bit）：以字节为单位</p>
</li>
<li><p>type of service（数据类型，8bit）：标识数据报载荷的类型，为了使分组调度时有依据（由于IP网络运营模式，现在基本不用）</p>
</li>
<li><p>length（数据报总长，16bit）：标识此IP数据报的总长，以字节为单位</p>
</li>
<li><p>分片/重组使用（如果IP数据报超过链路层的最大传输单元MTU，就会分片）</p>
<ul>
<li>16-bit identifier（16bit）：判断分片是否是同一个IP数据报</li>
<li>flags（4bit）：1 → 后面还有分片；0 → 后面无分片（此分片是最后一个）</li>
<li>fragment offset（12bit）：偏移量</li>
</ul>
</li>
<li><p>time to live（TTL，8bit）：最大剩余段数（每经过一个路由器减一）</p>
</li>
<li><p>upper layer（上层协议，8bit）：决定将载荷部分交给上层哪种类型的协议实体（例：TCP、UDP等）</p>
</li>
<li><p>Internet checksum（头部校验和，16bit）：数据部分不进行校验，只判断头部是否异常</p>
<blockquote>
<p>IPv6取消了该字段</p>
</blockquote>
</li>
<li><p>32 bit source IP address（32位源IP地址）</p>
</li>
<li><p>32 bit destination IP address（32位目标IP地址）</p>
</li>
<li><p>data：数据报的载荷部分</p>
</li>
<li><p>Options（可选部分）：例如，每经过一个交换节点，该地址会被记录在option中，即形成一个经过的路由器的列表，这样一来，目标端就知道该分组的传输路径。</p>
</li>
</ul>
</blockquote>
<h3 id="IP-分片和重组"><a href="#IP-分片和重组" class="headerlink" title="IP 分片和重组"></a>IP 分片和重组</h3><p>IP 分片的原因：</p>
<p>网络链路有MTU (最大传输单元)：链路层帧所携带的最大数据长度。如果IP数据报长度大于MTU，那么就需要将其分片。</p>
<blockquote>
<p>不同的链路类型有不同的MTU</p>
</blockquote>
<p>思考，如果仅仅是将一个IP数据报“粗暴”地直接分片，那么第一片包含头部信息，路由器知道如何处理，那么其他片没有头部信息，路由器便无法识别，显然这样是不行的。那么分片就需要一些“手段”：</p>
<p>假设要传输一个4000字节的数据报：20字节头部 + 3980字节数据</p>
<p>链路层最大传输单元（MTU）为：1500字节</p>
<ul>
<li><p>第一片：20Bytes头部 + 1480Bytes数据</p>
<ul>
<li>flags = 1</li>
<li>fragment offset = 0</li>
</ul>
</li>
<li><p>第二片：20Bytes头部 + 1480Bytes数据</p>
<ul>
<li>flags = 1</li>
<li>fragment offset = 1480 / 8 = 185</li>
</ul>
</li>
<li><p>第三片：20Bytes头部 + 1020Bytes数据</p>
<ul>
<li>flags = 0</li>
<li>fragment offset = 2960 / 8 = 370</li>
</ul>
<blockquote>
<p>注意：在计算偏移量的时候需要除以8（以8字节为单位）</p>
</blockquote>
</li>
</ul>
<p>每一片都到最后的目标主机才进行重组，中间转发节点不重组。</p>
<p>如果到达目标主机的分片有丢失，那么分片全部丢弃。</p>
<h3 id="IPv4"><a href="#IPv4" class="headerlink" title="IPv4"></a>IPv4</h3><h4 id="IP编址"><a href="#IP编址" class="headerlink" title="IP编址"></a>IP编址</h4><p>IP地址：32位标示，对主机或者路由器的接口编址</p>
<ul>
<li><p>一个IP地址和一个接口相关联</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%8F%B7%E4%B8%BE%E4%BE%8B.png"></p>
</li>
</ul>
<p>接口: 主机/路由器和物理链路的连接处</p>
<ul>
<li>路由器通常拥有多个接口</li>
<li>主机也有可能有多个接口</li>
<li>IP地址和每一个接口关联</li>
</ul>
<h4 id="子网（Subnets-）"><a href="#子网（Subnets-）" class="headerlink" title="子网（Subnets)）"></a>子网（Subnets)）</h4><p>如下图，是一个包含三个子网的网络</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例.png" style="zoom:80%;" />

<p>必备的两个条件：</p>
<ul>
<li>IP地址<ul>
<li>子网部分（高位bits），也称子网号：每个IP是相同的</li>
<li>主机部分（低位bits）</li>
</ul>
</li>
<li>在子网内部分组的收发不需要借助路由器（仅通过交换机），一跳可达。</li>
</ul>
<blockquote>
<p>子网的判断：</p>
<ul>
<li><p>要判断一个子网, 将每一个接口从主机或者路由器上分开,构成了一个个网络的孤岛</p>
</li>
<li><p>每一个孤岛（网络）都是一个都可以被称之为subnet</p>
</li>
<li><p>如下图，共有6个子网：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网示例2.png" style="zoom:67%;" /></li>
</ul>
</blockquote>
<h4 id="IP地址分类"><a href="#IP地址分类" class="headerlink" title="IP地址分类"></a>IP地址分类</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIP%E5%9C%B0%E5%9D%80%E7%B1%BB%E5%9E%8B%E5%88%92%E5%88%86.png"></p>
<p>A类地址：地址最高位为0，第一个字节的其它7位为网络号，后面三个字节（24bit）为主机号</p>
<ul>
<li>一共有126个网络（2<sup>7</sup> - 2，全零和全一的网络号不使用）</li>
<li>每个网络有2<sup>24</sup> - 2个主机</li>
</ul>
<p>B类地址：地址最高两位为10，前两个字节的其他14位为网络号，后面两个字节（16bit）为主机号</p>
<ul>
<li>一共有2<sup>14</sup> - 2个网络</li>
<li>每个网络有2<sup>16</sup> - 2个主机</li>
</ul>
<p>C类地址：地址最高三位为110，前三个字节的其他21位为网络号，后面一个字节（8bit）为主机号</p>
<ul>
<li>一共有2<sup>21</sup> - 2个网络</li>
<li>每个网络有2<sup>8</sup> - 2个主机</li>
</ul>
<blockquote>
<p>A、B、C类地址称为：“单播地址”</p>
<p>通常获取的都是C类地址</p>
</blockquote>
<p>D类地址（“组播地址”）：最高4位为1110，其余位为组播地址（Multicast address）</p>
<p>E类地址（预留）：最高5位为11110</p>
<blockquote>
<ul>
<li>互联网是以网络（局域网）为单位进行路由信息的通告，传播和计算。<ul>
<li>每个网络是路由表中的一个表项，而非IP地址</li>
</ul>
</li>
<li>子网信息可以进一步聚集，更高层次可以以广域网为单位。</li>
</ul>
</blockquote>
<p>特殊的IP地址：</p>
<ul>
<li><p>约定：</p>
<ul>
<li><p>子网部分: 全为0 → 本网络</p>
</li>
<li><p>主机部分: 全为0 → 本主机</p>
</li>
<li><p>主机部分: 全为1 → 广播地址，这个网路所有的主机</p>
</li>
<li><p>127.X.X.X：回路地址（测试地址）：即TCP/UDP数据报传到IP层面后返回</p>
<blockquote>
<p>类似我们在一个web项目的时候，本地测试模拟网络状态，通常地址为127.0.0.1（实际上访问的是本机）</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p>内网(专用)IP地址：</p>
<ul>
<li>专用地址：地址空间的一部份供专用地址使用</li>
<li>永远不会被当做公用地址来分配, 不会与公用地址重复<ul>
<li>只在局部网络中有意义，区分不同的设备</li>
</ul>
</li>
<li>路由器不对目标地址是专用地址的分组进行转发</li>
<li>专用地址范围：<ul>
<li>Class A： 10.0.0.0 ~ 10.255.255.255    MASK 255.0.0.0</li>
<li>Class B： 172.16.0.0 ~ 172.31.255.255    MASK 255.255.0.0</li>
<li>Class C： 192.168.0.0 ~ 192.168.255.255    MASK 255.255.255.0</li>
</ul>
</li>
</ul>
<h4 id="无类域间路由（CIDR）"><a href="#无类域间路由（CIDR）" class="headerlink" title="无类域间路由（CIDR）"></a>无类域间路由（CIDR）</h4><p>CIDR: Classless InterDomain Routing （无类域间路由）</p>
<blockquote>
<p>上述A、B、C类地址存在明确的划分（通过IP号），但这会存在一个问题，A类地址不必说，数量很少，瞬间就被分配完了，B类地址也是一样的道理，但是这类地址可分配的主机数量很多，通常没有企业单位会拥有如此多待分配的主机，为了充分利用资源，所以出现了无类域间路由。</p>
</blockquote>
<p>路由器如何区分无类域间路由？仅凭前几位是无法做到的（没有明确的网络号和主机号位数），因此伴随而生的子网掩码出现了：</p>
<ul>
<li><p>如果位为1：表示该位为网络位（子网部分）</p>
</li>
<li><p>如果位为0：表示该位为主机位</p>
</li>
<li><p>子网部分可以在任意的位置</p>
</li>
<li><p>地址格式: <code>a.b.c.d/x</code>, 其中 x 是地址中子网号的长度（另一种表示方式）</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN子网掩码示例.png" style="zoom:67%;" /></li>
</ul>
<blockquote>
<p>给定一个IP地址，计算网络号：将IP地址与对应的子网掩码进行<code>与</code>运算</p>
</blockquote>
<blockquote>
<p>原始的A、B、C类网络的子网掩码分别是：</p>
<ul>
<li>A：255.0.0.0 ：11111111 00000000 0000000 00000000</li>
<li>B：255.255.0.0：11111111 11111111 0000000 00000000</li>
<li>C：255.255.255.0：11111111 11111111 11111111 00000000</li>
</ul>
</blockquote>
<p>路由信息的匹配，分析路由表表项：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BD%AC%E5%8F%91%E8%A1%A8%E5%88%86%E6%9E%90.png"></p>
<blockquote>
<ul>
<li>目标子网号</li>
<li>子网掩码</li>
<li>下一跳</li>
<li>端口</li>
</ul>
</blockquote>
<ul>
<li>获得IP数据报的目标地址，将其与子网掩码进行<code>与</code>运算，得到网络号</li>
<li>对照路由表的目标子网号进行匹配：<ul>
<li>如果找到，则按照表项对应的接口转发该数据报</li>
<li>如果都没有找到,则使用默认表项转发数据报</li>
</ul>
</li>
</ul>
<p>一个主机如何获得IP地址：</p>
<ul>
<li><p>系统管理员手动分配，每个操作系统不一样</p>
</li>
<li><p>DHCP（ Dynamic Host Configuration Protocol）:从服务器中动态获得一个IP地址</p>
<ul>
<li><p>基于UDP的服务</p>
</li>
<li><p>允许主机在加入网络的时候，动态地从服务器那里获得IP地址：</p>
<ul>
<li>可以更新对主机在用IP地址的租用期（租期快到了）</li>
<li>重新启动时，允许重新使用以前用过的IP地址</li>
<li>支持移动用户加入到该网络（短期在网）</li>
</ul>
</li>
<li><p>DHCP工作概况：</p>
<ul>
<li><p>主机广播“DHCP discover” 报文[可选]</p>
</li>
<li><p>DHCP 服务器用 “DHCP offer”提供报文响应[可选]</p>
</li>
<li><p>主机请求IP地址：发送 “DHCP request” 报文</p>
</li>
<li><p>DHCP服务器发送地址：“DHCP ack” 报文</p>
<blockquote>
<p>最开始，主机用32位全零的地址作为本机地址，以32位全一的地址进行广播</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDHCP过程.png" style="zoom: 80%;" />

<p>DHCP 返回:</p>
<ul>
<li>IP 地址</li>
<li>第一跳路由器的IP地址（默认网关）</li>
<li>DNS服务器的域名和IP地址</li>
<li>子网掩码 (指示地址部分的网络号和主机号)</li>
</ul>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>一个主机如何获得一个网络的子网部分：</p>
<ul>
<li>一个机构，从ISP获得地址块中分配一个小地址块，该机构可以进行小地址块的分配</li>
<li>ICANN: Internet Corporation for Assigned Names and Numbers，通过该机构直接申请IP地址<ul>
<li>分配地址</li>
<li>管理DNS</li>
<li>分配域名，解决冲突</li>
</ul>
</li>
</ul>
<p>路由聚集（route aggregation）：是一种层次编址的方式，目的是减少路由信息通告、计算的数量。在路由匹配表项的时候，数量要大大减少。</p>
<blockquote>
<p>在路由聚集时，如果出现一个IP地址能匹配到多个路由表项（这是可能出现的）：采用最长前缀匹配，因为更精确。</p>
</blockquote>
<h3 id="NAT（Network-Address-Translation）"><a href="#NAT（Network-Address-Translation）" class="headerlink" title="NAT（Network Address Translation）"></a>NAT（Network Address Translation）</h3><p>NAT：网络地址转换</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B.png"></p>
<p>内网主机向外部发送分组时，经过路由，将内网地址转换为外网地址；同样的，外网的分组经路由传向内网时，将外网地址转换为内网地址。（内网节点共用一个IP）</p>
<p>使用NAT的原因：本地网络只有一个有效IP地址（IP地址申请使用需要付费）</p>
<ul>
<li>不需要从ISP分配一块地址，可用一个IP地址用于所有的（局域网）设备 → 省钱</li>
<li>可以在局域网改变设备的地址情况下而无须通知外界</li>
<li>可以改变ISP（地址变化）而不需要改变内部的设备地址，更换方便</li>
<li>局域网内部的设备没有明确的地址，对外是不可见的 → 安全</li>
</ul>
<p>若要实现NAT，则路由器必须支持NAT：</p>
<ul>
<li><p>外出数据包：替换源地址和端口号为NAT IP地址和新的端口号，目标IP和端口不变</p>
<blockquote>
<p>远端的C/S将会用NAP IP地址，新端口号作为目标地址</p>
</blockquote>
</li>
<li><p>记住每个转换替换对（在NAT转换表中）</p>
<blockquote>
<p>源IP | 端口    vs    NAP IP | 新端口</p>
</blockquote>
</li>
<li><p>进入数据包：替换目标IP地址和端口号，采用存储在NAT表中的mapping表项，用（源IP，端口）</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNNET%E7%A4%BA%E4%BE%8B2.png"></p>
</li>
</ul>
<p>对于NAT是有争议的：</p>
<ul>
<li><p>路由器只应该对第3层做信息处理（物理层、链路层、网络层），而这里对端口号（4层，传输层）作了处理，显然不符合分层规范。</p>
</li>
<li><p>违反了end-to-end 原则：</p>
<ul>
<li><p>端到端原则：复杂性放到网络边缘</p>
<p>无需借助中转和变换，就可以直接传送到目标主机，显然这里路由器也承担了很多工作</p>
</li>
<li><p>NAT可能要被一些应用设计者考虑，例如：P2P applications</p>
</li>
<li><p>外网的机器无法主动连接到内网的机器上（NAT穿越）</p>
</li>
</ul>
</li>
<li><p>NAT出现的原因是为了解决IP地址数量不够分配的情况，现在IP地址短缺的问题可以被IPv6解决</p>
</li>
<li><p>NAT穿越：</p>
<p>很明显，内网的设备主动联系外网设备是容易做到的（路由器会在分组发出的时候记录下映射关系），但是如果外网设备主动连接内网中的设备是不可以的，并不知道具体的端口号。</p>
<p>解决方案：</p>
<ul>
<li><p>方案一：把路由表固定写死，映射关系是确定的，这样外部来的分组就可以查路由表，交给内网对应的主机。</p>
</li>
<li><p>方案二： Universal Plug and Play (UPnP) 协议 / Internet Gateway Device (IGD) 协议</p>
<p>允许内网主机：</p>
<ul>
<li><p>获知网络的公共 IP地址</p>
</li>
<li><p>列举存在的端口映射</p>
</li>
<li><p>增/删端口映射 (在租用时间内)</p>
<blockquote>
<p>自动化静态NAT端口映射配置：外部分组到来，先查询路由表的映射关系，如果没有找到对应的端口，自动分配一个主机，赋予其端口号。</p>
</blockquote>
</li>
</ul>
</li>
<li><p>方案三：中继（used in Skype）</p>
<ul>
<li>NAT后面的服务器主动建立和中继的连接（强调：需要主动连接）</li>
<li>外部的客户端链接到中继</li>
<li>中继在两个连接之间桥接</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="ICMP"><a href="#ICMP" class="headerlink" title="ICMP"></a>ICMP</h3><p>因特网控制报文协议（ Internet Control Message Protocol，ICMP）</p>
<p>ICMP最典型的用途：差错报告</p>
<ul>
<li>由主机、路由器、网关用于 传达网络层控制信息<ul>
<li>错误报告：主机不可到达、 网络、端口、协议</li>
<li>Echo 请求和回复（ping）</li>
</ul>
</li>
<li>ICMP处在网络层，但是是在IP协议的上面<ul>
<li>ICMP消息由IP数据报承载</li>
</ul>
</li>
</ul>
<p>ICMP报文：类型（Type）、编码（Code）、引起ICMP报文首次生成的IP数据报首部和前8个字节内容（以便发送方能确定引发该差错的数据报）</p>
<table>
<thead>
<tr>
<th>ICMP类型</th>
<th>编码</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>0</td>
<td>0</td>
<td>回显回答（对ping的回答）</td>
</tr>
<tr>
<td>3</td>
<td>0</td>
<td>目的网络不可达</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>目的主机不可达</td>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td>目的协议不可达</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>目的端口不可达</td>
</tr>
<tr>
<td>3</td>
<td>6</td>
<td>目的网络未知</td>
</tr>
<tr>
<td>3</td>
<td>7</td>
<td>目的主机未知</td>
</tr>
<tr>
<td>4</td>
<td>0</td>
<td>源抑制（拥塞控制）</td>
</tr>
<tr>
<td>8</td>
<td>0</td>
<td>回显请求</td>
</tr>
<tr>
<td>9</td>
<td>0</td>
<td>路由器通告</td>
</tr>
<tr>
<td>10</td>
<td>0</td>
<td>路由器发现</td>
</tr>
<tr>
<td>11</td>
<td>0</td>
<td>TTL过期</td>
</tr>
<tr>
<td>12</td>
<td>0</td>
<td>IP首部损坏</td>
</tr>
</tbody></table>
<h4 id="Traceroute"><a href="#Traceroute" class="headerlink" title="Traceroute"></a>Traceroute</h4><ul>
<li>源主机发送一系列UDP段给目标主机<ul>
<li>第一个：TTL =1</li>
<li>第二个： TTL=2</li>
<li>依次递增</li>
<li>一个不可达的端口号</li>
</ul>
</li>
<li>当 nth 数据报到达 nth 路由器：<ul>
<li>路由器抛弃数据报</li>
<li>然后发送一个给源主机的ICMP报文 (type 11, code 0) → TTL过期</li>
<li>报文包括了路由器的名字和IP地址</li>
</ul>
</li>
<li>当 ICMP报文到达，源端计算RTT</li>
<li>标准的Traceroute程序实际上用相同的TTL发送3个一组的分组；因此Traceroute输出对每个TTL提供了3个结果</li>
<li>停止的判据：<ul>
<li>UDP 段最终到达目标主机</li>
<li>目标返回给源主机ICMP “端口不可达”报文 (type 3, code 3)</li>
<li>当源主机获得这个报文时，停止</li>
</ul>
</li>
</ul>
<hr>
<h3 id="IPv6"><a href="#IPv6" class="headerlink" title="IPv6"></a>IPv6</h3><p>引入IPv6的动机：IPv4的32-bit地址空间将会被很快用完</p>
<p>其他的原因：使用IPv4时路由器负担太重</p>
<blockquote>
<p>IP数据报在每次经过路由时TTL就会减一，相应的头部长度就会变，首部校验和也会跟着改变，那么每一跳路由都需要进行校验和，此外上述提到的分片，加大了路由转发的负担。</p>
</blockquote>
<p>IPv6数据报格式：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv6%E6%A0%BC%E5%BC%8F.png"></p>
<blockquote>
<p>说明：</p>
<ul>
<li><p>固定的40字节头部</p>
</li>
<li><p>数据报传输过程中，不允许分片</p>
<blockquote>
<p>考虑如果分组太大，超过链路层的最大传输单元MTU，该如何处理？</p>
<p>分组会被丢掉，同时向源主机发送一个ICMPv6的错误报告，目的让源主机重新发送更小的分组。</p>
</blockquote>
</li>
<li><p>长度由32位变为128位</p>
</li>
<li><p>Priority（pri）: 标示流中数据报的优先级</p>
</li>
<li><p>Flow Label（流标签）：标示数据报在一个“flow” </p>
<p>同一个IP发送出去的同一个会话的数据，可以形成一个流，让网络对同一个流的数据做同样的处理</p>
</li>
<li><p>Next header：标示上层协议（相当于IPv4中的upper layer（上层协议））</p>
<p>标识传来的数据应该交给上层的哪一个协议实体去处理。</p>
</li>
<li><p>hop limit：（相当于IPv4中的TTL）</p>
</li>
</ul>
<p>相比于IPv4的其他变化：</p>
<ul>
<li>Checksum: 被移除掉，降低在每一段中的处理速度</li>
<li>Options: 允许，但是在头部之外, 被 “Next Header” 字段标示</li>
<li>ICMPv6: 新增ICMP的新版本<ul>
<li>附加了报文类型，例如：“Packet Too Big”</li>
<li>增加多播组管理功能</li>
</ul>
</li>
</ul>
</blockquote>
<p>IPv4到IPv6的过渡：</p>
<p>不是所有的路由器都能够同时升级的，那么在IPv4和IPv6路由器混合时，网络如何运转？</p>
<p>同时升级不可行，因此只能采用平滑升级。</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E5%88%B0IPv6%E7%9A%84%E8%BF%87%E6%B8%A1.png"></p>
<blockquote>
<p>分析上图，在目前一段时间内，可能有部分支持IPv6设备，它们在整个IPv4的“网络海洋”中犹如一个个的“孤岛”，支持IPv6与IPv4的设备不能相互通信（当然IPv6内部的网络可以通信，IPv4同样如此），如果一个IPv6的“孤岛”想向另一个IPv6的“孤岛”发送信息，只需要给分组在IPv4的“网络海洋”之中准备一艘“小船”就好，或者是隧道。</p>
</blockquote>
<p>隧道: 在IPv4路由器之间传输的IPv4数据报中携带IPv6数据报</p>
<blockquote>
<p>在IPv6与IPv4的边缘有同时支持两种协议的双栈协议。</p>
</blockquote>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4%E9%9A%A7%E9%81%93.png"></p>
<p>可以将IPv6的数据报封装在IPv4的数据报当中，进行传输。</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNIPv4隧道视图2.png" style="zoom:80%;" />

<blockquote>
<p>全面部署IPv6还需要很长一段时间，当慢慢地网络变成IPv6的“海洋”时，IPv4称为“孤岛”，那么则使用IPv6的隧道进行数据报传输，直到最后全面部署IPv6，完成平滑过渡。</p>
</blockquote>
<h2 id="路由选择算法"><a href="#路由选择算法" class="headerlink" title="路由选择算法"></a>路由选择算法</h2><h3 id="路由（route）"><a href="#路由（route）" class="headerlink" title="路由（route）"></a>路由（route）</h3><p>路由：按照某种指标(传输延迟,所经过的站点数目等)找到一条从源节点到目标节点的较好路径。</p>
<blockquote>
<ul>
<li><p>较好路径: 按照某种指标较小的路径</p>
</li>
<li><p>指标:站数, 延迟,费用,队列长度等, 或者是一些单纯指标的加权平均</p>
<p>采用什么样的指标,表示网络使用者希望网络在什么方面表现突出,什么指标网络使用者比较重视</p>
</li>
</ul>
</blockquote>
<p>路由的计算单位：网络（子网）</p>
<blockquote>
<p>以IPv4为例，如果仅以精确的IP地址为计算单位，一共有2<sup>32</sup>个，那么这个计算量过于庞大。</p>
</blockquote>
<ul>
<li>网络为单位进行路由，路由信息传输、计算和匹配的代价低</li>
<li>前提条件是：一个网络所有节点地址前缀相同，且物理上聚集</li>
<li>路由就是：计算网络到其他网络如何走的问题（路由信息通告+路由计算）</li>
</ul>
<p>网络 - 网络的路由 = 路由器 - 路由器间的路由</p>
<ul>
<li>网络对应的路由器到其他网络对应的路由器的路由</li>
<li>在一个网络中：路由器 - 主机之间的通信，链路层解决</li>
<li>到了这个路由器就是到了这个网络</li>
</ul>
<p>路由器 - 路由器之间的最优路径 = 主机对之间的最优路径</p>
<ul>
<li>路由器连接子网，子网到路由器之间的跳数就是一跳，必须要走</li>
<li>路由器到下一跳路由器（节点到节点）之间的最优路径找到了，也就找到了从源子网向目标子网所有主机对之间的最优路径</li>
<li>大大降低了路由计算的规模</li>
<li>在路由计算中按照子网到子网的路径计算为目标，而不是主机到主机</li>
</ul>
<p>路由选择算法(routing algorithm)：网络层软件的一部分,完成路由功能</p>
<p>下图为网络的图抽象</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN网络的图抽象.png" style="zoom:80%;" />

<blockquote>
<p>说明：</p>
<ul>
<li>节点：路由器</li>
<li>边：把路由器连接在一起的网络或者是点到点的链路</li>
</ul>
</blockquote>
<p>边的代价（Cost of path）：</p>
<ul>
<li>表示方式：c(x,x<sup>‘</sup>) → 链路的代价 (x,x<sup>‘</sup>)</li>
</ul>
<blockquote>
<p>举例：c(w,z) = 5</p>
</blockquote>
<ul>
<li>代价可能总为１</li>
<li>或是链路带宽的倒数</li>
<li>或是拥塞情况的倒数</li>
</ul>
<p>路由的输入：拓扑、边的代价、源节点</p>
<p><strong>最优化原则(optimality principle)</strong></p>
<p>路由算法的最终目的是找到汇集树（sink tree）</p>
<ul>
<li>此节点到所有其它节点的最优路径形成的树</li>
<li>路由选择算法就是为所有路由器找到并使用汇集树</li>
</ul>
<p><strong>路由选择算法的原则：</strong></p>
<ul>
<li><p>正确性(correctness)：</p>
<p>算法必须是正确的和完整的,使分组一站一站接力，正确发向目标站；完整：目标所有的站地址，在路由表中都能找到相应的表项；没有处理不了的目标站地址；</p>
</li>
<li><p>简单性(simplicity)：</p>
<p>算法在计算机上应简单：最优但复杂的算法，时间上延迟很大，不实用，不应为了获取路由信息增加很多的通信量；</p>
<blockquote>
<p>在一条公路上，为了市民更好的通行而派出大量的警力去维持秩序，结果警力就占用了公路的三分之二，显然是不合理的。</p>
</blockquote>
</li>
<li><p>健壮性(robustness)：</p>
<p>算法应能适应<strong>通信量</strong>和<strong>网络拓扑</strong>的变化：通信量变化，网络拓扑的变化算法能很快适应；不向很拥挤的链路发数据，不向断了的链路发送数据；</p>
<blockquote>
<ul>
<li>两个路由节点之间的通信链路的传输速度有可能会发生改变</li>
<li>网络拓扑有可能发生改变：可能A、B两个节点原来是有通路的，结果这条通路又断掉了</li>
</ul>
<p>算法应该要适应这些变化。</p>
</blockquote>
</li>
<li><p>稳定性(stability)：</p>
<p>产生的路由不应该摇摆</p>
</li>
<li><p>公平性(fairness)：</p>
<p>对每一个站点都公平</p>
</li>
<li><p>最优性(optimality)：</p>
<p>某一个指标的最优，时间上，费用上，等指标，或综合指标；实际上，获取最优的结果代价较高，可以是次优的</p>
</li>
</ul>
<p>路由算法的分类：</p>
<p>从一个角度来看，可分为全局、分布式</p>
<ul>
<li>全局：<ul>
<li>所有的路由器拥有完整的拓扑和边的代价的信息</li>
<li>link state 算法</li>
</ul>
</li>
<li>分布式：<ul>
<li>路由器只知道与它有物理连接关系的邻居路由器，和到相应邻居路由器的代价值</li>
<li>叠代地与邻居交换路由信息、 计算路由信息</li>
<li>distance vector 算法</li>
</ul>
</li>
</ul>
<p>从另一个角度看，可分为静态、动态</p>
<ul>
<li>静态：<ul>
<li>路由随时间变化缓慢</li>
<li>非自适应算法(non-adaptive algorithm)：不能适应网络拓扑和通信量的变化,路由表是事先计算好的</li>
</ul>
</li>
<li>动态：<ul>
<li>路由变化很快<ul>
<li>周期性更新</li>
<li>根据链路代价的变化而变化</li>
</ul>
</li>
<li>自适应路由选择(adaptive algorithm)：能适应网络拓扑和通信量的变化</li>
</ul>
</li>
</ul>
<h3 id="链路状态算法（link-state，LS）"><a href="#链路状态算法（link-state，LS）" class="headerlink" title="链路状态算法（link state，LS）"></a>链路状态算法（link state，LS）</h3><p>链路状态算法就是著名的迪杰斯特拉(Dijkstra)算法。</p>
<p>配置LS路由选择算法的路由工作过程：</p>
<ul>
<li><p>各点通过各种渠道获得整个网络拓扑, 网络中所有链路代价等信息（这部分和算法没关系，属于协议和实现）</p>
</li>
<li><p>使用LS路由算法,计算本站点到其它站点的最优路径(汇集树),得到路由表</p>
</li>
<li><p>按照此路由表转发分组(datagram方式)【数据平面的工作】</p>
<ul>
<li>分发到输入端口的网络层（严格意义上说不是路由的一个步骤）</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNLS%E7%AE%97%E6%B3%95%E6%B5%81%E7%A8%8B.png"></p>
</li>
</ul>
<h4 id="基本工作过程"><a href="#基本工作过程" class="headerlink" title="基本工作过程"></a>基本工作过程</h4><p>链路状态（LS）路由的基本工作过程：</p>
<ol>
<li><p>发现相邻节点,获知对方网络地址</p>
<ul>
<li>一个路由器上电之后,向所有线路发送<code>HELLO</code>分组</li>
<li>其它路由器收到<code>HELLO</code>分组,回送应答,在应答分组中,告知自己的名字(全局唯一)</li>
<li>在LAN中,通过广播<code>HELLO</code>分组,获得其它路由器的信息,可以认为引入一个人工节点</li>
</ul>
</li>
<li><p>测量到相邻节点的代价(延迟,开销)</p>
<ul>
<li>实测法,发送一个分组要求对方立即响应</li>
<li>回送一个<code>ECHO</code>分组</li>
<li>通过测量时间可以估算出延迟情况</li>
</ul>
</li>
<li><p>组装一个链路状态（LS）分组,描述它到相邻节点的代价情况</p>
<ul>
<li>发送者名称</li>
<li>序号,年龄</li>
<li>列表: 给出它相邻节点,和它到相邻节点的延迟</li>
</ul>
</li>
<li><p>将分组通过扩散（泛洪）的方法发到所有其它路由器</p>
<ul>
<li><p>顺序号:用于控制无穷的扩散,每个路由器都记录(源路由器,顺序号),发现重复的或老的就不扩散（网络是一个环状的，不加以控制可以一直扩散下去，形成”广播风暴“，浪费了大量的资源，）</p>
<blockquote>
<p>具体问题：</p>
<ul>
<li>具体问题1: 循环使用问题</li>
<li>具体问题2: 路由器崩溃之后序号从0开始</li>
<li>具体问题3:序号出现错误</li>
</ul>
<p>解决方案：年龄字段(age)</p>
<ul>
<li>生成一个分组时,年龄字段不为0</li>
<li>每个一个时间段,AGE字段减1</li>
<li>AGE字段为0的分组将被抛弃</li>
</ul>
</blockquote>
</li>
<li><p>关于扩散分组的数据结构</p>
<ul>
<li>Source ：从哪个节点收到LS分组</li>
<li>Seq，Age：序号,年龄</li>
<li>Send flags：发送标记,必须向指定的哪些相邻站点转发LS分组</li>
<li>ACK flags：本站点必须向哪些相邻站点发送应答</li>
<li>DATA：来自source站点的LS分组</li>
</ul>
</li>
</ul>
<blockquote>
<p>以上4步让每个路由器获得拓扑和边代价</p>
</blockquote>
</li>
<li><p>通过Dijkstra算法找出最短路径（这才是路由算法）</p>
<ul>
<li>路由器获得各站点LS分组和整个网络的拓扑</li>
<li>通过Dijkstra算法计算出到其它各路由器的最短 路径(汇集树)<ul>
<li>每个节点独立算出来到其他节点（路由器=网络）的最短路径</li>
<li>迭代算法：第k步能够知道本节点到k个其他节点的最短路径</li>
</ul>
</li>
<li>将计算结果安装到路由表中</li>
</ul>
</li>
</ol>
<h4 id="应用情况"><a href="#应用情况" class="headerlink" title="应用情况"></a>应用情况</h4><p>链路状态的应用情况：</p>
<ul>
<li>OSPF协议是一种LS协议,被用于Internet上</li>
<li>IS-IS(intermediate system - intermediate system)：被用于Internet主干中, Netware </li>
</ul>
<h4 id="算法原理"><a href="#算法原理" class="headerlink" title="算法原理"></a>算法原理</h4><p>符号标记：</p>
<ul>
<li>c(i,j)：从节点 i 到 j 链路代价（初始状态下非相邻节点之间的链路代价为∞）</li>
<li>D(v)：从源节点到节点V的当前路径代价（节点的代价）</li>
<li>P(v)：从源到节点V的路径前序节点</li>
<li>N’: 当前已经知道最优路径的的节点集合（永久节点的集合）</li>
</ul>
<p>节点标记：每一个节点使用(D(v),p(v)) </p>
<blockquote>
<p>如： (3,B) 标记</p>
</blockquote>
<ul>
<li>D(v)从源节点由已知最优路径到达本节点的<strong>距离</strong></li>
<li>P(v)<strong>前序节点</strong>来标注</li>
</ul>
<p>两类节点：</p>
<ul>
<li>临时节点(tentative node)：还没有找到从源节点到此节点的最优路径的节点</li>
<li>永久节点(permanent node) <strong>N’</strong>：已经找到了从源节点到此节点的最优路径的节点</li>
</ul>
<p>流程：</p>
<ol>
<li><p>初始化</p>
<ul>
<li>除了源节点外,所有节点都为临时节点</li>
<li>节点代价除了与源节点代价相邻的节点外,都为∞</li>
</ul>
</li>
<li><p>从所有临时节点中找到一个节点代价最小的临时节点,将之变成永久节点（假设找到一个节点W）</p>
</li>
<li><p>对此节点的所有在临时节点集合中的邻节点，假设为节点V</p>
<ul>
<li><p>如 D(v) &gt; D(w) + c(w,v), 则重新标注此点, (D(W)+C(W,V), W)</p>
<blockquote>
<p>即源节点到V节点的距离又有最小值，则更新</p>
</blockquote>
</li>
<li><p>否则，不重新标注</p>
</li>
</ul>
</li>
<li><p>返回第2步，开始一个新的循环</p>
</li>
</ol>
<p>案例：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%BF%AA%E6%9D%B0%E6%96%AF%E7%89%B9%E6%8B%89%E7%AE%97%E6%B3%95%E6%A1%88%E4%BE%8B.png"></p>
<h4 id="Dijkstra算法的讨论"><a href="#Dijkstra算法的讨论" class="headerlink" title="Dijkstra算法的讨论"></a>Dijkstra算法的讨论</h4><ul>
<li><p>算法复杂度: n节点</p>
<ul>
<li>每一次迭代: 需要检查所有不在永久集合N中节点</li>
<li>n(n+1)/2 次比较: O(n<sup>2</sup>)</li>
<li>有很有效的实现: O(nlogn)</li>
</ul>
</li>
<li><p>可能的震荡：</p>
<p>举例：如果链路代价 = 链路承载的流量（拥塞程度）：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E9%93%BE%E8%B7%AF%E5%8F%AF%E8%83%BD%E9%9C%87%E8%8D%A1.png"></p>
</li>
</ul>
<h3 id="距离矢量算法（distance-vector，DV）"><a href="#距离矢量算法（distance-vector，DV）" class="headerlink" title="距离矢量算法（distance vector，DV）"></a>距离矢量算法（distance vector，DV）</h3><ul>
<li>动态路由算法之一</li>
<li>DV算法历史及应用情况：<ul>
<li>1957 Bellman, 1962 Ford Fulkerson</li>
<li>用于ARPANET, Internet(RIP) DECnet , Novell, ApplTalk</li>
</ul>
</li>
<li>距离矢量路由选择的基本思想<ul>
<li>各路由器维护一张路由表</li>
<li>各路由器与相邻路由器交换路由表</li>
<li>根据获得的路由信息,更新路由表</li>
</ul>
</li>
</ul>
<p>如下图示例：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由选择示例.png" style="zoom: 67%;" />

<p>代价及相邻节点间代价的获得：</p>
<ul>
<li>跳数(hops), 延迟(delay),队列长度</li>
<li>相邻节点间代价的获得：通过实测</li>
</ul>
<p>路由信息的更新：</p>
<ul>
<li>根据实测 得到本节点A到相邻站点的代价（如:延迟）</li>
<li>根据各相邻站点声称它们到目标站点B的代价</li>
<li>计算出本站点A经过各相邻站点到目标站点B的代价</li>
<li>找到一个最小的代价，和相应的下一个节点Z，到达节点 B经过此节点Z，并且代价为A-Z-B的代价</li>
</ul>
<blockquote>
<p>其它所有的目标节点一个计算法</p>
</blockquote>
<h4 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h4><p>如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量路由案例一续改.png" style="zoom:80%;" />

<ul>
<li>以当前节点J为例,相邻节点 A,I,H,K</li>
<li>J测得到A,I,H,K的延迟为： 8ms,10ms,12ms,6ms</li>
<li>通过交换DV, 从A,I,H,K获得到它们到G的延迟为 18ms,31ms,6ms,31ms</li>
<li>因此从J经过A,I,H,K到G的延迟为26ms,41ms,18ms, 37ms</li>
<li>将到G的路由表项更新为18ms,下一跳为：H</li>
<li>其它目标一样，除了本节点J（分组从J到J当然为0）</li>
</ul>
<h4 id="贝尔曼-福特（Bellman-Ford-）方程"><a href="#贝尔曼-福特（Bellman-Ford-）方程" class="headerlink" title="贝尔曼-福特（Bellman-Ford ）方程"></a>贝尔曼-福特（Bellman-Ford ）方程</h4><p>实际上距离矢量算法是基于<strong>贝尔曼-福特（Bellman-Ford ）方程</strong>（动态规划）。</p>
<ul>
<li><p>设：d<sub>x</sub> (y) = 从x到y的最小路径代价（x为源节点，y为目标节点）</p>
</li>
<li><p>则 d<sub>x</sub> (y) = min { c(x,v) + d<sub>v</sub> (y) }</p>
<blockquote>
<ul>
<li>min：取所有x的邻居取最小的v</li>
<li>c(x,v)：x到邻居v的代价</li>
<li>d<sub>v</sub> (y)：从邻居v到目标y的代价</li>
</ul>
</blockquote>
</li>
</ul>
<p>案例1：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B.png"></p>
<ul>
<li><p>明显：d<sub>v</sub> (z) = 5 , d<sub>x</sub> (z) = 3 , d<sub>w</sub> (z) = 3</p>
</li>
<li><p>由 B-F 方程得到：</p>
<p>d<sub>u</sub> (z) = min { c(u,v) + d<sub>v</sub> (z) ,  c(u,x) + d<sub>x</sub> (z) , c(u,w) + d<sub>w</sub> (z) } = { 2+5 , 1+3 , 5+3 } = 4</p>
</li>
</ul>
<p>核心思路：</p>
<ul>
<li><p>每个节点都将自己的距离矢量估计值传送给邻居，定时或者DV有变化时，让对方去算</p>
</li>
<li><p>当x从邻居收到DV时，自己运算，更新它自己的距离矢量（采用B-F equation）</p>
</li>
<li><p>D<sub>x</sub> (y)估计值最终收敛于实际的最小代价值d<sub>x</sub> (y)</p>
<blockquote>
<p>是迭代算法、分布式算法</p>
</blockquote>
</li>
</ul>
<p>异步式,迭代：每次本地迭代被以下事件触发：</p>
<ul>
<li>本地链路代价变化了</li>
<li>从邻居来了DV的更新消息</li>
</ul>
<p>分布式：</p>
<ul>
<li>每个节点只是在自己的DV改变之后向邻居通告</li>
<li>然后邻居们在有必要的时候通知他们的邻居</li>
</ul>
<p>每个节点的动作如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN距离矢量算法每个节点.png" style="zoom: 67%;" />

<p>案例2：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E8%B4%9D%E5%B0%94%E6%9B%BC%E7%A6%8F%E7%89%B9%E6%96%B9%E7%A8%8B%E6%A1%88%E4%BE%8B2.png"></p>
<h4 id="DV的特点"><a href="#DV的特点" class="headerlink" title="DV的特点"></a>DV的特点</h4><p>特点：</p>
<ul>
<li><p>好消息传的快</p>
<p>好消息的传播以每一个交换周期前进一个路由器的速度进行</p>
<p>举例：假设刚架设的路由节点A，它与B连通了</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%A5%BD%E6%B6%88%E6%81%AF.png"></p>
<blockquote>
<ul>
<li>经过第一个周期，c(A,B) = 1</li>
<li>经过第二个周期，c(A,C) = 2</li>
<li>如此下去</li>
</ul>
</blockquote>
</li>
<li><p>坏消息传的慢（无穷计算问题）</p>
<p>举例：路由节点A刚刚撤销了</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNDV%E5%9D%8F%E6%B6%88%E6%81%AF.png"></p>
<blockquote>
<ul>
<li>第一次交换之后, B从C处获得信息,C可以到达A(C-A,但是要经过B本身),但是路径是2,因此B变成3,从C处走</li>
<li>第二次交换,C从B处获得消息, B可以到达A,路径为3, 因此,C到A从B走,代价为4</li>
<li>形成了一个环路</li>
<li>无限次循环下去，到A的距离就变成了∞（不可达）</li>
</ul>
</blockquote>
</li>
</ul>
<p>实际上有一种缓解环路（无穷计算）的情况，即水平分裂(split horizon)算法。</p>
<h4 id="水平分裂-split-horizon-算法"><a href="#水平分裂-split-horizon-算法" class="headerlink" title="水平分裂(split horizon)算法"></a>水平分裂(split horizon)算法</h4><blockquote>
<p>注：有些教材也解释为“毒性逆转”。</p>
</blockquote>
<p>一种对无穷计算问题的解决办法：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A3%82%E7%AE%97%E6%B3%95%E4%B8%BE%E4%BE%8B.png"></p>
<ul>
<li><p>假设节点B直达A，C到A依赖于B，D到A依赖于B，C</p>
</li>
<li><p>现在突然A节点不可达</p>
</li>
<li><p>C知道要经过B才能到达A，所以C向B报告它到A的距离为∞（虚假信息）；但是C告诉D它到A的真实距离</p>
</li>
<li><p>同样的，D告诉C它通向A的距离为∞（虚假信息），但是D告诉E它到A的真实距离</p>
<blockquote>
<p>“左向虚假，右向真实”</p>
</blockquote>
</li>
<li><p>这样在第一次交换的时候，B通过测试发现到A的路径为∞，而C也告诉B到A的距离为∞，因此B到A的距离为∞</p>
</li>
<li><p>在第二次交换的时候，C从B和D那里获知,到A的距离为∞，因此C到A的距离为∞</p>
</li>
<li><p>如此，坏消息也同样以一次交换一个节点的速度传播</p>
</li>
</ul>
<p>值得注意的是，水平分裂算法在某些拓扑形式下会失败（存在环路），分析下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN水平分裂算法问题.png" style="zoom: 67%;" />

<ul>
<li>A,B到D的距离为2, C到D的距离为1</li>
<li>现在假设C-D通路销毁</li>
<li>C获知到D的距离为∞，从A,B获知到D的距离为∞，因此C认为D不可达</li>
<li>A从C获知D的距离为∞，但从B处获知它到D的距离为2，因此A到B的距离为3，从B走</li>
<li>B也有类似的问题</li>
<li>经过无限次之后，A和B都知道到D的距离为∞</li>
</ul>
<h3 id="LS-和-DV-算法的比较"><a href="#LS-和-DV-算法的比较" class="headerlink" title="LS 和 DV 算法的比较"></a>LS 和 DV 算法的比较</h3><p>下面我们来分析链路状态算法和距离矢量算法的差别：</p>
<ul>
<li><p>消息复杂度</p>
<ul>
<li>LS: 有 n 节点, E 条链路,发送 报文O(nE)个<ul>
<li>局部的路由信息；全局传播</li>
</ul>
</li>
<li>只和邻居交换信息<ul>
<li>全局的路由信息，局部传播</li>
</ul>
</li>
<li>距离矢量算法更优</li>
</ul>
</li>
<li><p>收敛时间</p>
<ul>
<li>LS：O(n<sup>2</sup>) 算法<ul>
<li>有可能震荡</li>
</ul>
</li>
<li>DV: 收敛较慢<ul>
<li>可能存在路由环路（无限循环问题）</li>
</ul>
</li>
<li>链路状态算法更优</li>
</ul>
</li>
<li><p>健壮性：如果路由器故障会发生什么</p>
<ul>
<li><p>LS：</p>
<ul>
<li>节点会通告不正确的链路代价</li>
<li>每个节点只计算自己的路由表</li>
<li>错误信息影响较小，局部，路由较健壮</li>
</ul>
</li>
<li><p>DV：</p>
<ul>
<li><p>DV 节点可能通告对全网所有节点的不正确路径代价</p>
</li>
<li><p>每一个节点的路由表可能被其它节点使用</p>
<blockquote>
<p>假如一个节点出现错误，通告全网到此路由的代价为0，那么全网的所有分组就都会涌向此节点</p>
</blockquote>
</li>
<li><p>错误可以扩散到全网</p>
</li>
</ul>
</li>
<li><p>链路状态算法更优</p>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>两种路由选择算法都有其优缺点，而且在互联网上都有应用。</p>
</blockquote>
<h2 id="因特网中自治系统（AS）内部的路由选择"><a href="#因特网中自治系统（AS）内部的路由选择" class="headerlink" title="因特网中自治系统（AS）内部的路由选择"></a>因特网中自治系统（AS）内部的路由选择</h2><h3 id="路由选择信息协议（Routing-Information-Protocol，RIP）"><a href="#路由选择信息协议（Routing-Information-Protocol，RIP）" class="headerlink" title="路由选择信息协议（Routing Information Protocol，RIP）"></a>路由选择信息协议（Routing Information Protocol，RIP）</h3><ul>
<li><p>在 1982年发布的BSD-UNIX 中实现</p>
</li>
<li><p>基于距离矢量算法：</p>
<ul>
<li><p>距离矢量：每条链路cost = 1，</p>
<p>代价就是跳数 (max = 15 hops，16代表目标不可达) </p>
</li>
<li><p>约定V每隔30秒和邻居交换距离矢量（DV），通告</p>
<ul>
<li>情况一：定期30秒，而且在改变路由的时候发送通告报文</li>
<li>情况二：在对方的请求下也可以发送通告报文</li>
</ul>
</li>
<li><p>每个通告包括：最多25个目标子网</p>
<ul>
<li>内容：目标网络 + 跳数（最大跳数为16，表示不可达）</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>下图是一个RIP协议的实例：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例.png" style="zoom: 67%;" />

<p>如果此时，节点A发送给D新的距离矢量，告知A到Z的跳数为4，那么D的距离矢量就会更新，如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP案例续.png" style="zoom: 67%;" />

<h4 id="链路失效和恢复"><a href="#链路失效和恢复" class="headerlink" title="链路失效和恢复"></a>链路失效和恢复</h4><p>如果180秒（6个周期）没有收到通告信息，则表示邻居或者链路失效</p>
<ul>
<li>发现经过这个邻居的路由已失效</li>
<li>新的通告报文会传递给邻居</li>
<li>邻居因此发出新的通告 (如果路由变化的话)</li>
<li>使用毒性逆转（poison reverse）/水平分裂算法，阻止ping-pong回路 ( 不可达的距离：跳数无限 = 16 段)</li>
</ul>
<h4 id="RIP-进程处理"><a href="#RIP-进程处理" class="headerlink" title="RIP 进程处理"></a>RIP 进程处理</h4><ul>
<li><p>RIP 以应用进程的方式实现：route-d (daemon)</p>
</li>
<li><p>通告报文通过UDP报文传送，周期性重复</p>
</li>
<li><p>网络层的协议使用了传输层的服务，以应用层实体的方式实现</p>
<blockquote>
<p>这一点很有趣，网络层的功能以应用进程的形式来实现，为了实现这个功能，还要借助传输层来传输距离矢量DV</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNRIP%E7%9A%84%E5%AE%9E%E7%8E%B0%E4%BE%9D%E8%B5%96.png"></p>
</blockquote>
</li>
</ul>
<h3 id="开放最短路优先（Open-Shortest-Path-First，OSFP）"><a href="#开放最短路优先（Open-Shortest-Path-First，OSFP）" class="headerlink" title="开放最短路优先（Open Shortest Path First，OSFP）"></a>开放最短路优先（Open Shortest Path First，OSFP）</h3><ul>
<li><p>“open”：标准可公开获得</p>
</li>
<li><p>使用链路状态算法：</p>
<ul>
<li>LS 分组在网络中（一个AS内部）分发</li>
<li>全局网络拓扑、代价在每一个节点中都保持</li>
<li>路由计算采用Dijkstra算法</li>
</ul>
</li>
<li><p>OSPF通告信息中携带：每一个邻居路由器一个表项</p>
<blockquote>
<p>“我是谁”，传输的链路状态分组是第几个版本，TTL</p>
<p>“我有哪些邻居，我到邻居的代价是多少”</p>
</blockquote>
</li>
<li><p>通告信息会传遍AS全部（通过泛洪）</p>
<ul>
<li>在IP数据报上直接传送OSPF报文 (而不是通过UDP和TCP)</li>
</ul>
</li>
<li><p>IS-IS路由协议：几乎和OSPF一样</p>
</li>
</ul>
<h4 id="OSPF高级特性"><a href="#OSPF高级特性" class="headerlink" title="OSPF高级特性"></a>OSPF高级特性</h4><p>这些特性是在RIP中所没有的。</p>
<ul>
<li><p>安全: 所有的OSPF报文都是经过认证的 (防止恶意的攻击)</p>
</li>
<li><p>允许有多个代价相同的路径存在 (在RIP协议中只有一个)</p>
<blockquote>
<p>可以在代价相同的节点作“负载均衡”。</p>
</blockquote>
</li>
<li><p>对于每一个链路，对于不同的TOS有多重代价矩阵</p>
<blockquote>
<p>例如：卫星链路代价对于尽力而为的服务代价设置比较低，对实时服务代价设置的比较高</p>
<p>支持按照不同的代价计算最优路径，如：按照时间和延迟分别计算最优路径</p>
</blockquote>
</li>
<li><p>对单播和多播的集成支持：</p>
<ul>
<li>Multicast OSPF (MOSPF) 使用相同的拓扑数据库，就像在OSPF中一样</li>
</ul>
</li>
<li><p>在大型网络中支持<code>层次性OSPF</code></p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CN层次化OSPF路由.png" style="zoom: 67%;" />

<blockquote>
<p>如果网络比较大，可以把自治区域划分成：骨干区域（backbone）、区域一、区域二……</p>
<p>不同的小区域之间的分组转发都需要借助区域边界路由器（area border routers），先将其路由至骨干区域。</p>
<p>泛洪仅在小区域内部进行。</p>
<p>分组的传递过程：小区域 →（通过区域边界路由器）→ 骨干区域 →（通过边界路由器）→ 传送到其他子网（依然通过另一个子网的骨干区域到达小区域） </p>
</blockquote>
</li>
</ul>
<p>层次性的OSPF路由：</p>
<ul>
<li><p>两个级别的层次性: 本地, 骨干</p>
<ul>
<li><p>链路状态通告仅仅在本地区域Area范围内进行</p>
</li>
<li><p>每一个节点拥有本地区域的拓扑信息</p>
<blockquote>
<p>关于其他区域，知道去它的方向，通过区域边界路由器（最短路径）</p>
</blockquote>
</li>
</ul>
</li>
<li><p>区域边界路由器: “汇总（聚集）”到自己区域内网络的距离, 向其它区域边界路由器通告</p>
<blockquote>
<p>同时参与了两个区域的路由计算</p>
</blockquote>
</li>
<li><p>骨干路由器: 仅仅在骨干区域内，运行OSPF路由</p>
</li>
<li><p>边界路由器: 连接其它的自治系统（AS’s）</p>
</li>
</ul>
<blockquote>
<p>小结一下：</p>
<p>如果</p>
</blockquote>
<h2 id="ISP之间的路由选择"><a href="#ISP之间的路由选择" class="headerlink" title="ISP之间的路由选择"></a>ISP之间的路由选择</h2><h3 id="一个平面的路由"><a href="#一个平面的路由" class="headerlink" title="一个平面的路由"></a>一个平面的路由</h3><ul>
<li>一个网络中的所有路由器的地位一样</li>
<li>通过LS, DV，或者其他路由算法，所有路由器都要知道其他所有路由器（子网）如何走</li>
<li>所有路由器在一个平面</li>
<li>平面路由的问题：<ul>
<li>规模巨大的网络中，路由信息的存储、传输和计算代价巨大：<ul>
<li>DV: 距离矢量很大，且不能够收敛</li>
<li>LS：几百万个节点的LS分组的泛洪传输，存储以及最短路径算法的计算</li>
</ul>
</li>
<li>管理问题：<ul>
<li>不同的网络所有者希望按照自己的方式管理网络</li>
<li>一方面希望对外隐藏自己网络的细节</li>
<li>当然，还希望和其它网络互联</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>一个平面的路由面临计算成本的高昂代价以及管理问题，为此出现了一个解决方案：层次路由。</p>
<h3 id="层次路由"><a href="#层次路由" class="headerlink" title="层次路由"></a>层次路由</h3><blockquote>
<p>将互联网中的路由问题分为两个层面（按照物理分布范围）：</p>
<ul>
<li>自治区域内</li>
<li>自治区域间</li>
</ul>
</blockquote>
<ul>
<li><p>层次路由：将互联网分成一个个自治区域AS(路由器区域)</p>
<ul>
<li>某个区域内的路由器集合，自治系统（autonomous systems ，AS)</li>
<li>一个AS用 <code>AS Number（ASN)</code>唯一标示</li>
<li>一个ISP可能包括一个或者多个AS</li>
</ul>
</li>
<li><p>路由变成了两个层次的路由：</p>
<ul>
<li>AS内部路由：在同一个AS内路由器运行相同的路由协议<ul>
<li><strong>intra-AS routing protocol：内部网关协议</strong></li>
<li>不同的AS可能运行着不同的内部网关协议（如：LS，DV）</li>
<li>能够解决规模和管理问题</li>
<li>如：RIP,OSPF,IGRP</li>
<li>网关路由器：AS边缘路由器，可以连接到其他AS</li>
</ul>
</li>
<li>AS间运行AS间路由协议<ul>
<li><strong>inter-AS routing protocol：外部网关协议</strong></li>
<li>解决AS之间的路由问题，完成AS之间的互联互通</li>
</ul>
</li>
</ul>
</li>
<li><p>层次路由的优点：</p>
<ul>
<li><p>解决了规模问题：</p>
<ul>
<li><p>内部网关协议解决：AS内部数量有限的路由器相互到达的问题, AS内部规模可控</p>
<blockquote>
<p>如果AS节点太多，可继续分割AS，使得AS内部的节点数量有限</p>
</blockquote>
</li>
<li><p>AS之间的路由的规模问题：</p>
<ul>
<li>增加一个AS，对于AS之间的路由从总体上来说，只是增加了一个节点=子网（每个AS可以用一个点来表示）</li>
<li>对于其他AS来说只是增加了一 个表项，就是这个新增的AS如何走的问题</li>
<li>扩展性强：规模增大，性能不会减得太多</li>
</ul>
</li>
</ul>
</li>
<li><p>解决了管理问题：</p>
<ul>
<li>各个AS可以运行不同的内部网关协议</li>
<li>可以使自己网络的细节不向外透露，增加安全性</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="边界网关协议（Border-Gateway-Protocol，BGP）"><a href="#边界网关协议（Border-Gateway-Protocol，BGP）" class="headerlink" title="边界网关协议（Border Gateway Protocol，BGP）"></a>边界网关协议（Border Gateway Protocol，BGP）</h3><ul>
<li><p>BGP (Border Gateway Protocol): 自治区域间路由协议“事实上的”标准</p>
<blockquote>
<p>将互联网各个AS粘在一起的胶水</p>
</blockquote>
</li>
<li><p>BGP 提供给每个AS以以下方法：</p>
<ul>
<li><p>eBGP: 从相邻的ASes那里获得子网可达信息（外部）</p>
</li>
<li><p>iBGP: 将获得的子网可达信息传遍到AS内部的所有路由器（内部）</p>
</li>
<li><p>根据子网可达信息和策略来决定到达子网的“最优”路径</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP连接.png" style="zoom: 67%;" /></li>
</ul>
</li>
<li><p>允许子网向互联网其他网络通告“我在这里”</p>
</li>
<li><p>基于距离矢量算法（路径矢量）</p>
<ul>
<li>这是一种“改进”后的距离矢量</li>
<li>不仅仅是距离矢量，还包括到达各个目标网络的详细路径（AS序号的列表）能够避免简单DV算法的路由环路问题</li>
</ul>
</li>
</ul>
<h4 id="BGP会话"><a href="#BGP会话" class="headerlink" title="BGP会话"></a>BGP会话</h4><ul>
<li><p>BGP 会话: 两个BGP路由器(“peers”)在一个半永久的TCP连接上 交换BGP报文（包括子网可达信息）:</p>
<ul>
<li>通告向不同目标子网前缀的“路径”（BGP是一个“路径矢量”协议）</li>
</ul>
</li>
<li><p>当AS3中新增了X节点（如下图）：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%BF%9E%E6%8E%A52.png"></p>
<p>当AS3网关路由器3a向AS2的网关路由器2c通告路径： AS3,X</p>
<ul>
<li>3a参与AS内路由运算，知道本AS所有子网X信息</li>
<li>语义上：AS3向AS2承诺，它可以向子网X转发数据报</li>
<li>3a是2c关于X的下一跳（next hop）</li>
</ul>
</li>
</ul>
<p>路径的属性：</p>
<ul>
<li>当通告一个子网前缀时，通告包括 BGP 属性：<ul>
<li>prefix + attributes = “route”</li>
</ul>
</li>
<li>两个重要的属性：<ul>
<li><strong>AS-PATH</strong>: 前缀的通告所经过的AS列表: AS 67、AS 17<ul>
<li>检测环路；多路径选择</li>
<li>在向其它AS转发时，需要将自己的AS号加在路径上</li>
</ul>
</li>
<li><strong>NEXT-HOP</strong>: 从当前AS到下一跳AS有多个链路，在NETX-HOP属性中，告诉对方通过那个 链路转发</li>
<li>其它属性：路由偏好指标，如何被插入的属性</li>
</ul>
</li>
</ul>
<p>BGP是基于策略的路由：</p>
<ul>
<li>当一个网关路由器接收到了一个路由通告, 使用<strong>输入策略</strong>来接受或过滤（accept / decline）<ul>
<li>过滤原因例1：不想经过某个AS，转发某些前缀的分组</li>
<li>过滤原因例2：已经有了一条往某前缀的偏好路径</li>
</ul>
</li>
<li>策略也决定了是否向它别的邻居通告收到的这个路由信息</li>
</ul>
<h4 id="BGP路径通告"><a href="#BGP路径通告" class="headerlink" title="BGP路径通告"></a>BGP路径通告</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A.png"></p>
<ul>
<li><p>路由器AS2.2c从AS3.3a接收到的AS3,X路由通告 (通过eBGP)</p>
</li>
<li><p>基于AS2的输入策略，AS2.2c决定接收AS3,X的通告，而且通过iBGP（TCP连接）向AS2的所有路由器进行通告</p>
</li>
<li><p>基于AS2的策略，AS2路由器2a通过eBGP向AS1.1c路由器通告 AS2,AS3,X 路由信息</p>
<blockquote>
<p>路径上加上了 AS2自己作为AS序列的一跳</p>
</blockquote>
</li>
</ul>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E8%B7%AF%E5%BE%84%E9%80%9A%E5%91%8A2.png"></p>
<p>网关路由器可能获取有关一个子网X的多条路径，从多个eBGP 会话上：</p>
<ul>
<li><p>AS1 网关路由器1c从2a学习到路径：<code>AS2,AS3,X</code></p>
</li>
<li><p>AS1网关路由器1c从3a处学习到路径：<code>AS3,X</code></p>
</li>
<li><p>基于策略，AS1路由器1c选择了路径：<code>AS3,X</code>，而且通过iBGP告诉所有AS1内部的路由器</p>
<blockquote>
<p>不一定跳数少即判定为代价小，要基于策略的判断</p>
<p>有政治策略（例如：敌对公司）、经济策略等</p>
</blockquote>
</li>
</ul>
<h4 id="BGP报文"><a href="#BGP报文" class="headerlink" title="BGP报文"></a>BGP报文</h4><ul>
<li><p>使用TCP协议交换BGP报文</p>
</li>
<li><p>BGP 报文：</p>
<p><code>OPEN</code>：打开TCP连接，认证发送方</p>
<p><code>UPDATE</code>：通告新路径 (或者撤销原路径)</p>
<p><code>KEEPALIVE</code>：在没有更新时保持连接，也用于对 OPEN 请求确认</p>
<p><code>NOTIFICATION</code>：报告以前消息的错误，也用来关闭连接</p>
</li>
</ul>
<p>问题：一个自治区域（AS1）中的普通路由器如何才能将分组传递到另一个自治区域（AS2）内的路由器？</p>
<p>区域边界路由器可以通过外部网关协议获知AS2中路由器的存在，并通过内部网关协议通告AS1中所有的路由器。</p>
<h4 id="BGP-路径选择"><a href="#BGP-路径选择" class="headerlink" title="BGP 路径选择"></a>BGP 路径选择</h4><ul>
<li>路由器可能获得一个网络前缀的多个路径，路由器必须进行路径的选择，路由选择可以基于：<ul>
<li>本地偏好值属性: 偏好策略决定</li>
<li>最短AS-PATH：AS的跳数</li>
<li>最近的NEXT-HOP路由器：热土豆路由（给最近的）</li>
<li>附加的判据：使用BGP标示</li>
</ul>
</li>
<li>一个前缀对应着多种路径，采用消除规则直到留下一条路径</li>
</ul>
<h4 id="热土豆路由"><a href="#热土豆路由" class="headerlink" title="热土豆路由"></a>热土豆路由</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/CNBGP%E7%83%AD%E5%9C%9F%E8%B1%86%E8%B7%AF%E7%94%B1.png"></p>
<ul>
<li>2d通过iBGP获知，它可以通过2a或者2c到达X</li>
<li>热土豆策略：选择具备最小内部区域代价的网关作为往X的出口（如：2d选择2a，即使往X可能有比较多的AS跳数）：<strong>不要操心域间的代价</strong></li>
</ul>
<h3 id="内部网关协议与外部网关协议的不同"><a href="#内部网关协议与外部网关协议的不同" class="headerlink" title="内部网关协议与外部网关协议的不同"></a>内部网关协议与外部网关协议的不同</h3><ul>
<li>策略：<ul>
<li>Inter-AS: 管理员需要控制通信路径，谁在使用它的网络进行数据传输</li>
<li>Intra-AS: 一个管理者，所以无需策略<ul>
<li>AS内部的各子网的主机尽可能地利用资源进行快速路由</li>
</ul>
</li>
</ul>
</li>
<li>规模：<ul>
<li>AS间路由必须考虑规模问题，以便支持全网的数据转发</li>
<li>AS内部路由规模不是一个大的问题<ul>
<li>如果AS 太大，可将此AS分成小的AS；规模可控</li>
<li>AS之间只不过多了一个点而已</li>
<li>或者AS内部路由支持层次性，层次性路由节约了表空间, 降低了更新的数据流量</li>
</ul>
</li>
</ul>
</li>
<li>性能：<ul>
<li>Intra-AS: 关注性能</li>
<li>Inter-AS: 策略可能比性能更重要</li>
</ul>
</li>
</ul>
<hr>
<h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>本篇已完结</p>
<p>（如有补充或错误，欢迎评论区留言）</p>

    </div>

    
    
    
      
  <div class="popular-posts-header">相关文章</div>
  <ul class="popular-posts">
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\03\28\计算机网络\计算机网络学习笔记\" rel="bookmark">计算机网络学习笔记</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\05\10\计算机网络\计算机网络学习笔记-传输层\" rel="bookmark">计算机网络学习笔记-传输层</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\04\05\计算机网络\计算机网络学习笔记-应用层\" rel="bookmark">计算机网络学习笔记-应用层</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\03\09\计算机网络\计算机网络学习笔记-计算机网络概述\" rel="bookmark">计算机网络学习笔记--计算机网络概述</a></div>
    </li>
  </ul>


    <footer class="post-footer">
          <div class="reward-container">
  <div></div>
  <button>
    赞赏
  </button>
  <div class="post-reward">
      <div>
        <img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/wechat.png" alt="花猪 微信">
        <span>微信</span>
      </div>
      <div>
        <img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/alipay.jpg" alt="花猪 支付宝">
        <span>支付宝</span>
      </div>

  </div>
</div>

          <div class="post-tags">
              <a href="/next/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" rel="tag"><i class="fa fa-tag"></i> 计算机网络</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/next/2021/06/07/Flask/Flask%E5%89%8D%E7%AB%AF%E7%94%A8CSS%E4%BF%AE%E9%A5%B0%E5%BE%AA%E7%8E%AF%E4%BB%A3%E7%A0%81%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9/" rel="prev" title="Flask前端用CSS修饰循环代码的注意事项">
                  <i class="fa fa-chevron-left"></i> Flask前端用CSS修饰循环代码的注意事项
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/next/2021/06/09/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86/" rel="next" title="操作系统学习笔记-文件管理">
                  操作系统学习笔记-文件管理 <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






    <div class="comments"><div id="twikoo-comments"></div></div>
</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">


<div class="copyright">
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">花猪</span>
</div>
<div class="wordcount">
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-line"></i>
    </span>
      <span>站点总字数：</span>
    <span title="站点总字数">356k</span>
  </span>
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
      <span>站点阅读时长 &asymp;</span>
    <span title="站点阅读时长">5:23</span>
  </span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/mist/" rel="noopener" target="_blank">NexT.Mist</a> 强力驱动
  </div>

    </div>
  </footer>

  
  <script src="https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@next-theme/pjax@0.5.0/pjax.min.js" integrity="sha256-3NkoLDrmHLTYj7csHIZSr0MHAFTXth7Ua/DDt4MRUAg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js" integrity="sha256-yt2kYMy0w8AbtF89WXb2P1rfjcP/HTHLT7097U8Y5b8=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/medium-zoom@1.0.6/dist/medium-zoom.min.js" integrity="sha256-EdPgYcPk/IIrw7FYeuJQexva49pVRZNmt3LculEr7zM=" crossorigin="anonymous"></script>
<script src="/next/js/comments.js"></script><script src="/next/js/utils.js"></script><script src="/next/js/motion.js"></script><script src="/next/js/schemes/muse.js"></script><script src="/next/js/next-boot.js"></script><script src="/next/js/pjax.js"></script>

  
<script src="/next/js/third-party/search/local-search.js"></script>




  


  <script class="next-config" data-name="leancloud_visitors" type="application/json">{"enable":true,"app_id":"dh8GVAcIwU1TN4zhA5y63iW1-gzGzoHsz","app_key":"hzyAqDKjG4OBGrdPS7mKaOa7","server_url":null,"security":true}</script>
  <script src="/next/js/third-party/statistics/lean-analytics.js"></script>


  

  <script class="next-config" data-name="enableMath" type="application/json">true</script><script class="next-config" data-name="mathjax" type="application/json">{"enable":true,"tags":"none","js":{"url":"https://cdn.jsdelivr.net/npm/mathjax@3.2.0/es5/tex-mml-chtml.js","integrity":"sha256-r+3itOMtGGjap0x+10hu6jW/gZCzxHsoKrOd7gyRSGY="}}</script>
<script src="/next/js/third-party/math/mathjax.js"></script>


<script class="next-config" data-name="twikoo" type="application/json">{"enable":true,"visitor":true,"envId":"hexo-1g41404w9f800e94","el":"#twikoo-comments"}</script>
<script>
document.addEventListener('page:loaded', () => {
  NexT.utils.loadComments(CONFIG.twikoo.el)
    .then(() => NexT.utils.getScript(
      'https://cdn.jsdelivr.net/npm/twikoo/dist/twikoo.all.min.js',
      { condition: window.twikoo }
    ))
    .then(() => {
      twikoo.init(CONFIG.twikoo);
    });
});
</script>

</body>
</html>
